J*****n 发帖数: 4859 | 1 template
struct base
{
void interface()
{
// ...
static_cast(this)->implementation();
// ...
}
};
struct derived : base
{
void implementation();
};
上面的程序如果用父类指针指向儿子,那似乎是如下的写法:
base *p = new derived()
这里的话,如果已经事先知道了所指向的对象是derived的,那么直接用derivaed的指
针去指就可以了。何必画蛇添足呢?
还是我的理解有问题?
请高手指点一下。
谢谢。 |
g*****y 发帖数: 7271 | 2 那里写的这个call法?还是你自己想的?
【在 J*****n 的大作中提到】 : template : struct base : { : void interface() : { : // ... : static_cast(this)->implementation(); : // ... : } : };
|
J*****n 发帖数: 4859 | 3
是我自己想的,原代码里面没有写怎么用。
所以比较迷糊。不过似乎应该这么写的吧?
请指教。
谢谢。
【在 g*****y 的大作中提到】 : 那里写的这个call法?还是你自己想的?
|
g*****y 发帖数: 7271 | 4 应该就是 Derived d; d.interface();
【在 J*****n 的大作中提到】 : : 是我自己想的,原代码里面没有写怎么用。 : 所以比较迷糊。不过似乎应该这么写的吧? : 请指教。 : 谢谢。
|
J*****n 发帖数: 4859 | 5
那这个叫什么多态?
【在 g*****y 的大作中提到】 : 应该就是 Derived d; d.interface();
|
g*****y 发帖数: 7271 | 6 之所以这么叫,是因为在base里面的function interface(),可以调用派生
类的implementation. 所以你可以通过写derived class来customize不同
的implementation。
但是不同于virtual function,这个是在编译时绑定的,你必需明确声明派生类
来调用相应的implementation。所以叫static polymorphism。
【在 J*****n 的大作中提到】 : : 那这个叫什么多态?
|
J*****n 发帖数: 4859 | 7
但你这个做法现实中没什么用阿。
你应经知道了你要定义的是什么类型的东西了,函数重载就可以了,何必这么麻烦。
多态是用父类的指针指向儿子才对吧?
【在 g*****y 的大作中提到】 : 之所以这么叫,是因为在base里面的function interface(),可以调用派生 : 类的implementation. 所以你可以通过写derived class来customize不同 : 的implementation。 : 但是不同于virtual function,这个是在编译时绑定的,你必需明确声明派生类 : 来调用相应的implementation。所以叫static polymorphism。
|
g*****y 发帖数: 7271 | 8 函数重载的话,你必须同时重载interface()。如果只是重载implementation
的话,base里的interface()是不会去调用你重载的implementation的。
如果interface里面也有不少code的话,你不会希望每个派生类再复制一遍
interface里的code吧。
【在 J*****n 的大作中提到】 : : 但你这个做法现实中没什么用阿。 : 你应经知道了你要定义的是什么类型的东西了,函数重载就可以了,何必这么麻烦。 : 多态是用父类的指针指向儿子才对吧?
|
i*********n 发帖数: 58 | |