0

我有一个获取'A'对象的函数,它被称为:func。我给它发送一个 B 的对象。

它不应该激活B的构造函数吗?因为我发送了一个 B 的对象,尽管我必须发送一个 A 的对象。我真的不知道为什么这个函数会打印:

A()
DESTRUCTOR A

并不是:

CONSTRUCTOR A
CONSTRUCTOR B
B()
DESTRUCTOR B
DESTRUCTOR A

它不是必须乘以对象 B 因为func得到A a而不是A& a

这是我的代码:

class A
{
  public:
    A() { cout << "CONSTRUCTOR A\n"; }
    ~A() { cout << "DESTRUCTOR A\n"; }
    virtual void f() { cout << "A()" << endl; }
};

class B: public A
{
  public:
    B() { cout << "CONSTRUCTOR B\n"; }
    ~B() { cout << "DESTRUCTOR B\n"; }
    virtual void f() { cout << "B()" << endl; }
};

void func(A a) {
    a.f();
}

int main() {
    B b;
    func(b);
    return 0;
}
4

2 回答 2

1

因为如果您发送儿子,但该函数要求父亲类,它会将孩子视为父亲。

class A
{
  public:
    A() { cout << "CONSTRUCTOR A\n"; }
    ~A() { cout << "DESTRUCTOR A\n"; }
    virtual void f() { cout << "A()" << endl; }
};

class B: public A
{
  public:
    B() { cout << "CONSTRUCTOR B\n"; }
    ~B() { cout << "DESTRUCTOR B\n"; }
    virtual void f() { cout << "B()" << endl; }
};

void func(B a) {
    a.f();
}

int main() {
    B b;
    func(b);
    return 0;
}

如果您尝试此代码,您会看到预期的结果。

于 2013-05-05T17:26:26.387 回答
1

我认为您感到困惑的原因是因为您传递的是值而不是指针。这就是为什么 B 对象被视为 A 的原因,因为 func 接受 A 的值,它默认将对象视为 A,这也意味着调用了错误的析构函数。运行此代码,您会更好地理解。

#include <iostream>

using namespace std;

class A
{
  public:
    A() { cout << "CONSTRUCTOR A\n"; }
    ~A() { cout << "DESTRUCTOR A\n"; }
    virtual void f() { cout << "A()" << endl; }
};

class B: public A
{
  public:
    B() { cout << "CONSTRUCTOR B\n"; }
    ~B() { cout << "DESTRUCTOR B\n"; }
    virtual void f() { cout << "B()" << endl; }
};

void func(A * a) {
    a->f();
}

int main() {
    B * b = new B();;
    cout << "\n";
    func(b);
    cout << "\n";
    delete b;
    return 0;
}

这基本上是虚函数的要点,当使用继承时,您希望能够将所有内容作为父类指针传递。但是,您要调用的方法是子类方法。当您按值传递对象时,必须将其视为传入的对象。

于 2013-05-05T17:28:25.447 回答