作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我将基于我的问题的代码示例:
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 类中的虚函数?或者这只是一种完全错误的方法?
最佳答案
int main()
{
C c("Hello", "to", "you");
A* a = &c;
a->printInfo(); // "C class"
}
这,由于关键字 virtual
,执行虚拟分派(dispatch),调用最派生的 printInfo
。
您可以禁用虚拟调度并调用特定函数:
a->A::printInfo(); // "A class"
因为 a
是 A*
所以通常的函数调用规则适用。
这里遗漏的羊是B::printInfo()
:
a->B::printInfo(); // error: 'B' is not a base of 'A'
B::printInfo
既不是最派生的覆盖程序,也不是 A
的成员。因此,为此,您必须向编译器 promise a
确实指向 C
(或者至少是 B
) :
static_cast<B*>(a)->B::printInfo();
// "B class"
恶心。
通常,只要出现这种“需要”,您就应该质疑您的方法,因为它有不良设计的味道。
关于c++ - 初始化派生类时虚函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615565/
我是一名优秀的程序员,十分优秀!