Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c+中具有虚函数调用的构造函数+; 首先代码不工作Visual C++,但工作中有“血腥< /P>”_C++_Constructor_Virtual - Fatal编程技术网

c+中具有虚函数调用的构造函数+; 首先代码不工作Visual C++,但工作中有“血腥< /P>”

c+中具有虚函数调用的构造函数+; 首先代码不工作Visual C++,但工作中有“血腥< /P>”,c++,constructor,virtual,C++,Constructor,Virtual,输出为0,但根据我的理解,应该为1;有人能解释一下吗 #include<iostream> using namespace std; class shape { public: virtual void print() const =0; virtual double area() { return 0.0;} }; class point : public shape { int x; int y; public : point(int a=

输出为0,但根据我的理解,应该为1;有人能解释一下吗

#include<iostream>
using namespace std;
class shape
{
public:
    virtual void print() const =0;
    virtual double area() { return 0.0;}
};
class point : public shape
{
    int x;
    int y;
public :
    point(int a=11, int b=11)
    {
        x=a;
        shape *s;
        s=this;
        cout<<s->area();
        y=b;
    }
    double area()const {return 1.0;}
    void print() const
    {
        cout<<"\nPoint\n";
        cout<<x<<"\t"<<y;
    }
};

int main()
{   
    point p(1,2);
    return 0;
}
#包括
使用名称空间std;
阶级形态
{
公众:
虚空打印()常量=0;
虚拟双区域(){return 0.0;}
};
课程要点:公共形态
{
int x;
int-y;
公众:
点(int a=11,int b=11)
{
x=a;
形状*s;
s=这个;

cout在函数的构造函数中调用虚函数就好像该函数不是虚函数一样。这可能会让人困惑,但这是c语言中的标准行为++


如果你想实现你的目标,那么你应该在构造函数之后调用一个“初始化”函数,在这个函数中,虚拟函数调用将按照你的预期工作。

你得到了正确的输出。当你调用
area()时,它应该是
0
在派生类的构造函数中,实际上调用的是
area()
的基本版本,而不是派生版本。在构造函数中调用虚拟函数不会调用派生类中的重写函数


阅读

从构造函数调用虚拟函数是一个非常糟糕的主意。有关详细信息,请参见此(参见第3段)。

您的代码中有一个微妙的缺陷:

double area()const {return 1.0;}

基类“
area()
方法未声明
const
。因此,point::area不是一个虚拟方法。要么声明
shape::area
const
,要么从
point::area
中删除const,它将按预期工作。

重复,请参阅例如,我投票赞成重新打开。这不是一个完全重复的方法。该问题存在一个问题,即th const/NONCST重写器,并且调用不会发生在基类的构造函数中(与链接的“duplicate”相反)。声称任何构造函数问题的答案都是完全错误的。如果您主要执行
cout area()
实际上,这并不令人困惑。如果函数的行为是虚拟的并调用了派生类方法,那么我们将在派生类构造函数没有首先执行的情况下调用该方法。实际上,在构造过程中调用虚拟方法是未定义的行为。rational Tarydon提出的是最好的逻辑方法从编译器的角度来看,这取决于编译器如何实现虚拟方法(并且故意)未被标准定义,以允许编译器尽可能高效。因此不同编译器对其进行不同的处理(如OP结果所示)。@马丁,C++标准:“成员函数,包括虚拟函数(10.3),可以在构造或销毁过程中调用(12.6.2)。”这个答案是错误的。请注意,常见问题解答说“当我的基类的构造函数调用其This对象上的虚拟函数时。”“-但是在代码中,调用是由派生的类构造函数完成的。我发布链接只是为了展示给定机制是如何工作的(在构造函数中有一个函数调用)。如果派生类中的调用确实会重写基类函数,则该调用应该命中派生类函数。但这不是因为
常量
。它与构造函数无关。此答案是错误的。请修复。对构造函数/析构函数中的虚函数的任何调用都具有未定义的行为(如调用程序所示的,根据编译器的不同,有两种不同的答案)。它完全取决于编译器如何实现虚拟调用机制。通常,C++ FAQ Lite在细节上(不是一个好的参考源)。@马丁,C++标准的127P3(强调我):“成员函数,包括虚函数(10.3))。,可在构造或销毁过程中调用(12.6.2)。当从构造函数(包括数据成员的mem初始值设定项)直接或间接调用虚拟函数时或者从析构函数调用,并且调用应用的对象是正在构造或销毁的对象,调用的函数是在构造函数或析构函数自己的类或其基中定义的函数。“这看起来像是问题。因为指针不是“const shape*”它不会调用常量函数,而是调用非常量函数。您必须确保声明是正确的same@mayur如果你的答案是帮助你的,你可能希望接受他的答案。请使用比C++ FAQ Lite更具权威性的东西(如C++标准)。C++(FAQ FLQ Lite)知道有很多错误和误导信息。(虽然它确实有一些有用的信息)。C++有效的同意W Nave: