初始化派生类时使用虚函数

时间:2014-07-07 16:38:39

标签: c++

以下是我将根据问题提出的代码示例:

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类中的虚函数?或者这只是一种完全错误的做法?

1 个答案:

答案 0 :(得分:4)

int main()
{
    C c("Hello", "to", "you");

    A* a = &c;
    a->printInfo();  // "C class"
}

由于关键字virtual,执行虚拟调度,调用派生程度最高的printInfo

您可以禁用虚拟分派并调用特定功能:

a->A::printInfo();   // "A class"

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

这里剩下的羊是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;出现了,因为它闻起来很糟糕。