Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 虚拟函数c++;_C++ - Fatal编程技术网

C++ 虚拟函数c++;

C++ 虚拟函数c++;,c++,C++,我试着做了一些练习,当我最终认为我明白了时,它来了一个破坏一切的练习。 例如,我有以下课程: class A { public: A() {std::cout<<"A()";} virtual ~A(){std::cout<<"~A()";} virtual void print() {std::cout<<"A";} }; class B : public A { public: B() {std::cout<&l

我试着做了一些练习,当我最终认为我明白了时,它来了一个破坏一切的练习。 例如,我有以下课程:

class A
{
public:
    A() {std::cout<<"A()";}
    virtual ~A(){std::cout<<"~A()";} 

    virtual void print() {std::cout<<"A";}
};

class B : public A
{
public:
    B() {std::cout<<"B()";}
    virtual ~B(){std::cout<<"~B()";} 

    virtual void print() {std::cout<<"B";}
};
我认为其结果是:

A() A()
A() B() {not sure why there is an A() too)
A - and here I really don't know because either A and B are virtual(and I have in the notebook A) 
~B() ~A()
~A() ~A()
还有另一段代码片段:

void f3()
{
    A a[2];
    a[1]=B();
    a[1].print();
}
void f4()
{
    A* a[]={new A(), new B()};
    a[0]->print();
    a[1]->print();
    delete a[0];
    delete a[1];
}
这也是一个问题。我们有

A() {here I don t know why there is an A()}
A() B()
A
B
~B() ~A()
A()
但这是对的?为什么这里有A和B,而不是B和A?我的意思是,在第一个练习中,我有A,当它是B()类型时,这里是我认为它是正常的,但为什么

A() A()
您创建了一个包含两个A的数组,因此调用了两个ctor

A() B() {not sure why there is an A() too)
您创建了一个B(
B()
),而B是从As派生出来的,因此步骤是:分配内存来存储a B,调用a的ctor来存储a-part,调用B的ctor来存储B-part

A - and here I really don't know because either A and B are virtual(and I have in the notebook A)
您将新创建的B分配给了A,因此这将导致B的A部分的副本发送到目标A。然后您在A上调用了
print
,这将打印
A

~B() ~A()
~A() ~A()
DTOR的调用与CTOR的调用完全相反

在第二次尝试中,使用指针和动态分配,在本例中使用多态性。数组是一个包含两个指向类型A的指针的数组,用两个对象(地址)初始化:第一个以A开头,第二个以B开头

调用
a[0]->print()
时,
a[0]
是a的地址,因此调用a的方法
print


调用
a[1]->print()
时,
a[1]
是a B的地址,因此调用它的方法
print
,因为
print
virtual

y u no
a().print();B().print()使我更容易理解在什么时候发生了什么以及为什么我会像这里这样点击编译器:在那里你可以看到哪一行触发了哪一条语句。谢谢。你帮了我很多。我想最后两个例子是指最后一个例子中的指针大小写,应该分别是[0]->print()和[1]->print()。谢谢你的解释:)我终于明白了这是怎么回事。