构造函数中的C ++虚函数

时间:2016-07-29 18:41:34

标签: c++ constructor polymorphism

我正在阅读关于c ++构造函数的this文章

  

我们建议您在调用虚拟功能时要小心   构造函数。因为始终调用基类构造函数   在派生类构造函数之前,调用的函数   基础构造函数是基类版本,而不是派生类   版。在以下示例中,构造DerivedClass会导致   print_it()的BaseClass实现在之前执行   DerivedClass构造函数导致DerivedClass实现   print_it()执行:

示例:

    class BaseClass {
    public:
        BaseClass() {
            print_it();
        }
        virtual void print_it() {
            cout << "BaseClass print_it" << endl;
        }
    };

    class DerivedClass : public BaseClass {
    public:
        DerivedClass() {
            print_it();
        }
        virtual void print_it() {
            cout << "Derived Class print_it" << endl;
        }
    };

    int main() {

        DerivedClass dc;
    }

这是输出:

BaseClass print_it
Derived Class print_it

I tried this code and the output is as stated above。 但是我也尝试了没有虚拟关键字的相同示例:

    class BaseClass {
    public:
        BaseClass() {
            print_it();
        }
        void print_it() {
            cout << "BaseClass print_it" << endl;
        }
    };

    class DerivedClass : public BaseClass {
    public:
        DerivedClass() {
            print_it();
        }
        void print_it() {
            cout << "Derived Class print_it" << endl;
        }
    };

    int main() {

        DerivedClass dc;
    }

and got the same result

那么它们有什么不同以及它们警告的危险是什么?

@marked as duplicate:

这个问题是不同的,因为consturctors都调用虚方法而不是一个调用虚方法的构造函数。

1 个答案:

答案 0 :(得分:7)

没有区别。 那是危险。

如果你不知道更好,那么你可能会想到这一点:

Derived Class print_it
Derived Class print_it

期望存在,因为如果您从virtual中的函数调用print_it() Base,则多态意味着您通常会获得Derived版本。< / p>

但是,当你在Base构造函数中编写它时,对象的Base部分仍在构建中,并且&#34;动态类型&#34;正在构建的对象仍然是Base,而不是Derived。所以你没有得到通常的多态行为。

文章警告你这个事实。