初始化派生类时使用虚函数
Usage of virtual functions when initializing a derived class
下面是我将基于我的问题的代码示例:
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
,执行虚拟调度,调用最派生的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"
恶心。
一般来说,当这种"需求"出现时,你应该质疑你的方法,因为它散发出糟糕的设计味道。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 在 C++ 中用派生类型重写成员函数
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如果基类包含双指针成员,则派生类的构造函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 在派生类中绑定非静态模板化成员函数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 覆盖虚拟函数 - 派生类具有不同的参数
- 正在调用基方法,而不是从构造函数派生方法
- 从具有相同虚拟函数的父函数派生时如何调用子函数
- 从派生类对象调用基类函数.派生类构造函数中设置的基类数据成员