首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数中的C++虚函数

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

Stack Overflow用户
提问于 2016-07-29 18:41:33
回答 1查看 486关注 0票数 2

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

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

例子:

代码语言:javascript
复制
    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;
    }

这是输出:

代码语言:javascript
复制
BaseClass print_it
Derived Class print_it

我尝试了这段代码,输出如下所示。但是,我也尝试了相同的示例,没有使用虚拟关键字:

代码语言:javascript
复制
    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;
    }

得到了同样的结果

那么,这两者之间有什么区别,它们所警告的危险是什么?

@标记为重复:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 19:05:02

没有什么不同。这就是危险所在。

如果您不太了解,那么您可能会期望这样做:

代码语言:javascript
复制
Derived Class print_it
Derived Class print_it

这种期望是存在的,因为如果您从virtual print_it()中调用Base函数,那么多态意味着您通常会得到Derived版本。

但是,当您在Base构造函数中编写它时,对象的Base部分仍在构造中,正在构建的对象的“动态类型”仍然是Base,而不是Derived。所以你不能得到通常的多态行为。

这篇文章警告你这个事实。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38665566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档