【发布时间】:2010-03-02 13:27:54
【问题描述】:
我正在阅读 Bruce Eckel 的 Thinking in C++。在第 15 章(第 1 卷)的标题“构造函数中虚函数的行为”下,他说
如果你在里面会发生什么 构造函数,你调用一个虚拟的 功能?普通会员内部 功能你可以想象会发生什么 发生 - 虚拟呼叫已解决 在运行时,因为对象不能 知道它是否属于类 成员函数在,或者一些 派生自它的类。为了 一致性,你可能认为这是 里面应该发生什么 构造函数。
Bruce 在这里试图解释当您在对象的构造函数中调用虚函数时,不会表现出多态性,即只会调用当前类的函数,而不会是该函数的其他派生类版本。这是有效的,我可以理解,因为类的构造函数不会事先知道它是为它运行还是为其他衍生对象的创建运行。此外,如果这样做,它将在部分创建的对象上调用函数,这是灾难性的。
虽然我突然感到困惑是因为他在第一句话中陈述了普通成员函数,但他说虚拟调用将在运行时解析。但是等等,在一个类的任何成员函数中,当你调用另一个函数(无论是虚拟的还是非虚拟的)时,它自己的类版本只会被调用,对吧?例如
class A
{
virtual void add() { subadd(); }
virtual subadd() { std::cout << "A::subadd()\n"; }
};
class B : public A
{
void add() { subadd(); }
void subadd() { std::cout << "B::subadd()\n"; }
};
在上面的代码中,在A::add() 中,当调用subadd() 时,它总是调用A::subadd(),B 也是如此,对吧?那么他所说的“虚拟调用在运行时被解析,因为对象不知道它是属于成员函数所在的类,还是从它派生的某个类”是什么意思?
他是在解释通过基类指针的调用吗? (我真的很怀疑)在这种情况下,他不应该写“在普通成员函数中”;据我目前的理解,任何从同一类的另一个成员函数中调用成员函数都不是多态的,如果弄错了,请纠正我。
【问题讨论】:
-
现在这是“尝试一下”的好案例。
-
我在发布之前尝试过,它只显示了各自的成员函数,就像我上面写的那样。
-
如果你想让 B 从 A 派生,你没有告诉编译器。
-
@Eric:谢谢,修好了!
标签: c++ polymorphism virtual-functions member-functions