0

「A」のオブジェクトを取得する関数があります。それはfunc. Bの対象でお届けします。

B のコンストラクターをアクティブにすべきではありませんか? Aのオブジェクトを送信する必要があるのに、Bのオブジェクトを送信する原因.この関数が出力する理由が本当にわかりません:

A()
DESTRUCTOR A

ではない:

CONSTRUCTOR A
CONSTRUCTOR B
B()
DESTRUCTOR B
DESTRUCTOR A

get と not があるため、オブジェクト B を乗算する必要funcA 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

あなたが混乱している理由は、ポインターではなく値で渡しているからだと思います。これが、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 に答える
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 に答える