gpt4 book ai didi

c++ - 纯虚函数调用错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:17 24 4
gpt4 key购买 nike

我觉得这很奇怪。在 Sample_Base 的构造函数中,我调用了 bar() ,它在内部调用了 fun() ,这是一个纯虚函数。我收到错误“纯虚函数”调用。这很好。现在,如果我直接从 Sample_Base 的构造函数调用 fun(),我就不会收到该错误。我在 VC++ 2010 Beta 2 和 Ubuntu 9.10 上的 g++ 4.4.1 上试过了。我同意为纯虚函数提供一个实现,而不是纯虚析构函数,是没有意义的。但是,我对这种行为感到有些惊讶。

class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/

void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};

Sample_Base::~Sample_Base()
{

}

void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}

class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}

void fun()
{
std::cout << "Sample_Derived::fun\n";
}

~Sample_Derived()
{

}
};

最佳答案

当您直接调用该函数时,由于您在构造函数中,编译器会解析您对象的静态类型 (Sample_Base) 并调用 Sample_Base::fun() 直接。由于您为其提供了一个实现,编译器会找到该函数并且它可以工作。

当您通过 bar() 间接调用它时,编译器必须使用动态类型,因此它会执行一个在运行时解析的虚拟调用。它失败了,因为它调用了一个纯虚函数。

所以区别在于它将函数绑定(bind)到调用的那一刻。

关于c++ - 纯虚函数调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991147/

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