【发布时间】:2014-09-25 17:18:39
【问题描述】:
我经常使用多态性,但我突然意识到。我的代码是这样的:
class A{
class B : public A{
class C : public A{
我使用A 类作为多态参数类型,用于传入B 或C 子类型:
//Accepts B and C objects
void aMethod(A* a){
但是,我给了A 一个虚拟析构函数——这是 A(以及 B 和 C)包含 vtable 指针的唯一原因。
所以我的问题是,如果我没有用虚拟析构函数声明 A,那么 A 就不会是多态的——我将无法在 aMethod()?? 中传递 B 或 C 类型的对象?
那么非多态继承只是共享代码,而多态(基类必须有一个 vtable)允许将子类型作为基类类型的参数传递?
【问题讨论】:
-
void aMethod接受A类型的对象?您需要它来获取多态性的指针或引用。否则,您只是在切片B和C对象。 -
如果您的参数像您的示例一样按值传递,您的对象将被切片。
-
这在 10 年前可能是一个很好的问题,A) 还有其他更好的方法来实现多态行为 B) 你的标题没有反映问题 C) 继承是关于 是一个关系/属性——不管你想怎么称呼它——在它自己的核心,
virtual关键字并没有改变它,它只是增加了多态性。
标签: c++ inheritance polymorphism virtual-functions