以下是我将根据问题提出的代码示例:
using namespace std;
class A {
public:
A(char *t) {
cout << "A: " << t << endl;
}
virtual void printInfo() {}
};
class B : public A {
public:
B(char *t, char *tt) : A(t) {
cout << "B: " << tt << endl;
}
virtual void printInfo() {
cout << "B class";
}
};
class C : public B {
public:
C(char *t, char *tt, char *ttt) : B(t, tt) {
cout << "C: " << ttt << endl;
}
virtual void printInfo() {
cout << "C class";
}
};
int main(int argc, char *argv[]) {
C c("Hello", "to", "you");
A *a = &c;
a->printInfo();
//This program prints:
//A: Hello
//B: to
//C: you
//C class
return 0;
}
考虑到我的C类构造函数初始化B,而B执行A,我将如何调用B类中的虚函数?或者这只是一种完全错误的做法?
答案 0 :(得分:4)
int main()
{
C c("Hello", "to", "you");
A* a = &c;
a->printInfo(); // "C class"
}
由于关键字virtual
,执行虚拟调度,调用派生程度最高的printInfo
。
您可以禁用虚拟分派并调用特定功能:
a->A::printInfo(); // "A class"
因为a
是A*
所以通常的函数调用规则适用。
这里剩下的羊是B::printInfo()
:
a->B::printInfo(); // error: 'B' is not a base of 'A'
B::printInfo
既不是最衍生的覆盖者,也不是A
的成员。因此,为此,您必须向a
真正指向C
(或至少是B
)的编译器做出承诺:
static_cast<B*>(a)->B::printInfo();
// "B class"
呸。
一般来说,只要这个&#34;需要&#34;出现了,因为它闻起来很糟糕。