-1

我有以下课程:

#include <iostream>

using namespace std;

class M
{
};

class N:public M
{
};

class A
{
    public:
        virtual void f(M& m)=0;
};

class B:public A
{
    public:
        void f(M& m){cout<<"using M version"<<endl;}
        void f(N& n){cout<<"using N version"<<endl;}
};

以及以下实现:

int main()
{
    N n;
    A &o = *new B();
    o.f(n);
    //o.f(static_cast<N&>(n));
}

基本上我希望在调用“of(n)”时实现“void f(N&)”而不是“void f(M&)”,但不知道如何实现它。

4

4 回答 4

1

你应该使用虚函数。这就是多态性的用途:在运行时确定对象的类型。f()将代码修改为虚函数,如下所示。

#include <iostream>

using namespace std;

class A
{
    private:
        int a;
    public:
        A():a(1){}
        void show(){cout<<a<<endl;}
        virtual void f(A & a) {a.show();}
};

class B:public A
{
    private:
        int b;
    public:
        B():b(2){}
        void show(){cout<<b<<endl;}
        virtual void f(B & a) {a.show();}
};

int main()
{
    A * pa = new A();
    f(*pa);
    pa = new B();
    f(*pa);
}
于 2013-06-01T01:08:53.460 回答
1

对于您描述的特定行为,您可以使用 static_cast:

f(static_cast<B&>(*pa));

但是每个人都是对的,你最好通过将show()方法设为虚拟来使用真正的多态性:

#include <iostream>

using namespace std;

class A
{
    private:
        int a;
    public:
        A():a(1){}
        virtual void show(){cout<<a<<endl;}
};

class B:public A
{                                                                                                                                                                                     
    private:
        int b;
    public:
        B():b(2){}
        void show(){cout<<b<<endl;}
};

void f(A & a) {a.show();}

int main()
{
    A * pa = new A();
    f(*pa);
    pa = new B();
    f(*pa);
}
于 2013-06-01T01:12:54.227 回答
1

保持指针B并调用f(*pb). 或f(*static_cast<B*>(pa));

尽管我认为您可能真正想要的是使您的方法虚拟化。

virtual void show(){cout<<a<<endl;}

它仍然会调用第一个f()但会show()调用B.

以下示例应该可以帮助您更好地理解动作中的不同概念:

#include <iostream>

using namespace std;

class A
{
public:
    void show(){cout<<"show: A"<<endl;}
    virtual void show_virtual(){cout << "show_virtual: A" << endl; }
};

class B:public A
{
public:
    void show(){cout<<"show: B"<<endl;}
    virtual void show_virtual(){cout << "show_virtual: B" << endl; }
};

void f(A & a)
{
    cout << "f(A&)" << endl;
    a.show();
    a.show_virtual();
}
void f(B & b)
{
    cout << "f(B&)" << endl;
    b.show();
    b.show_virtual();
}

int main()
{
    A * pa = new A();
    B * pb = new B();
    A * pb_a = pb;

    f(*pa);
    cout << endl;
    f(*pb);
    cout << endl;
    f(*pb_a);
}

具有以下输出

f(A&)
show: A
show_virtual: A

f(B&)
show: B
show_virtual: B

f(A&)
show: A
show_virtual: B
于 2013-06-01T01:13:26.273 回答
0
  • 基本上我希望在调用“of(n)”时实现“void f(N&)”而不是“void f(M&)”,但不知道如何实现它。

您不能调用“void f(N&)”,因为 class 中没有这样的方法A

void f(N&)解决方案声明class A

class A
{
    public:
        virtual void f(M& m)=0;
        virtual void f(N& n)=0;
}
于 2013-06-01T22:02:18.927 回答