0

C ++では、これはポインターで機能します

#include <iostream>

using namespace std;

struct Base {
    virtual void base_method() {
        cout << "this is the base\n";
    }
};

struct Derived : public Base {
    void base_method() {
        cout << "this is the child\n";
    }
};

void test(Base & b) {
    b.base_method();
}

void test2(Base * b) {
    b->base_method();
}

int main() {
    Derived * d;
    Derived & d1();
    test2(d); //this works 
    test(d1); //this doesn't
    return 0;
}

Child & c()テスト関数に渡されたような参照で同じことができないのはなぜですか。ポインターと参照は同様に動作する傾向があるため、これを尋ねます

4

3 に答える 3

5

それは、あなたの例の選択が不十分だからです。new通常、ユーザー コードの周りに裸の 's を配置するべきではありません。

次の例は、類似点を示しています。

 struct Base { virtual ~Base() {} };
 struct Derived : Base { };

 void foo(Base *);

 void bar(Base &);

 int main()
 {
     Derived x;
     foo(&x);  // fine
     bar(x);   // fine and even better
 }

(また、親子関係はベース派生関係とは大きく異なることに注意してください。後者は「is-a」関係であり、前者は「supports-till-25」関係です。)

于 2013-05-28T06:51:43.153 に答える
3
Derived & d() 

関数宣言 (戻り値の型 Derived& で、入力パラメーターを持たない) であり、オブジェクトのインスタンス化ではありません。これは C++ の MVP ( http://en.wikipedia.org/wiki/Most_vexing_parse )です。

この構文を使用します

Derived d;

そう呼ぶ

test(d);
于 2013-05-28T07:14:27.527 に答える
3

Derived & d1();あなたが想定したことをしません。

ここを見てください:

[10.2] リスト x; の間に違いはありますか? およびリスト x();? 大きな違い!

List が何らかのクラスの名前であるとします。次に、関数 f() は、x というローカル List オブジェクトを宣言します。

void f()
{
  List x;     // Local object named x (of class List)
  ...
}

ただし、関数 g() は、リストを返す x() という関数を宣言しています。

void g()
{
  List x();   // Function named x (that returns a List)
  ...
}
于 2013-05-28T07:17:20.670 に答える