2
struct struct1
{};
struct struct2:public struct1
{};
class Base
{
public:
    virtual void foo(struct1 *s)
    {
        cout<<"foo in Base"<<endl;
    }
};
class Der:public Base
{
public:
    virtual void foo(struct2 *s)
    {
        cout<<"Foo in Der"<<endl;
    }
};
int main()
{
    struct2 s;
    Base *b = new Der();
    b->foo(&s);
}

main で関数を呼び出すと、Base のメンバーが呼び出されます。"foo in Base" が出力されます。Derived クラス関数が struct1 ポインターを受け取ると、"foo in Der" が出力されます。しかし、struct2ポインタを取り、「foo in Der」を表示させる方法はありますか

4

1 に答える 1

3

あなたが求めているのは、 の動作をオーバーライドBase::fooすることを意味すると解釈すると、関数への共変引数になります。これは、派生型が基本型の契約を狭めているため、オブジェクト指向では不可能です。それはリスコフの置換原理を破るでしょう。後者はオブジェクトではないオブジェクトを受け入れないため、Basetype のオブジェクトを type のオブジェクトに置き換えることはできません。Derstruct1struct2

派生型関数が同じシグネチャを持つ(つまり、 も取るstruct1*)場合、 の動作がオーバーライドされ、動的Baseディスパッチが開始されますstruct2*Base

于 2013-02-23T05:13:10.907 に答える