Virtual functions c++

Virtual functions c++

本文关键字:c++ functions Virtual      更新时间:2023-10-16

我尝试做一些练习,当我最终认为我理解时,它来了一个破坏一切的练习。例如,我有以下类:

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";}
};

以及以下代码片段:

void f3()
{
    A a[2];
    a[1]=B();
    a[1].print();
}

我认为结果是:

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 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?我的意思是,在第一个练习中,当它是 B() 类型时,我有 A,这就是我认为这是正常的,但为什么?

A() A()

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

A() B() {not sure why there is an A() too)

您创建了一个 B(B() ),并且 B 是从 A 派生的,因此步骤是:分配内存以存储 B,

调用 A 的 ctor 以获取 A 部件,调用 B 的 ctor 以获取 B 部件。
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 的调用方式与 CTORS 完全相反。

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

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

当你调用 a[1]->print() 时,a[1] 是 B 的地址,所以调用它print的方法,因为printvirtual的。