gpt4 book ai didi

c++ - 初始化派生类时虚函数的使用

转载 作者:行者123 更新时间:2023-11-27 23:04:21 27 4
gpt4 key购买 nike

这是我将基于我的问题的代码示例:

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"

因为 aA* 所以通常的函数调用规则适用。

这里遗漏的羊是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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com