gpt4 book ai didi

c++ - 虚函数 C++

转载 作者:行者123 更新时间:2023-11-30 03:52:13 25 4
gpt4 key购买 nike

我曾尝试做一些练习,当我终于认为我理解了,它来了一个毁掉一切的练习。例如我有以下类(class):

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

最佳答案

A() A()

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

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

您创建了一个 B ( B() ),而 B 是从 A 派生的,因此步骤是:分配内存来存储 B,为 A 部分调用 A 的 ctor,为 B 调用 B 的 ctor -部分。

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。然后您调用了 print在 A 上,打印出 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 .

关于c++ - 虚函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834845/

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