2014-01-29 62 views
-2

这是一个简单的问题(我认为)。我只是不知道这件事,我正在寻找一个好的解决方案太:)C++:继承优先

比方说,我有这样的:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
} 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     // do_something 
    } 
} 

// Name is a class that is basically a String and assign it to any A or B object. 

class A: public Derived { 
    public: 
    A(name N) { ... } 
    virtual ~A() {} 
} 

class B: public Derived { 
    public: 
    B(name N) { ... } 
    virtual ~B() {} 
    A& connect(A &a) 
    { 
     // do something else 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    A objA("A"); 
    B objB("B"); 

    // Here's where is my issue 
    objB.connect(objA); 
} 

当我打电话objB.connect(objA),它实际上是调用Base& connect(Base &b)。我明白,因为他们都是Base的孩子,并且都有Derived中定义的connect()。但事情是,我希望每当我有objB.connect(objA)时,它应该调用A& connect(A &a)来代替。

我想知道是否有办法以我想要的方式拥有它。

谢谢:)

UPDATE

我编辑的这一点,因为我有几个错别字。我没有复制粘贴代码,因为它比我希望的复杂得多。 <希望它够了。

+3

显示编译的代码。 'objA = new A();'用指针初始化一个对象。你的bug可能是对引用或强制转换(或其他类型问题)的细微误用,所以我们需要*精确*代码来重现它。 – Angew

+0

你在连接(A&a)的定义中忘记了'virtual' – Thomas

+0

这个东西不会编译'A objA = new A()'。我用过的所有编译器都拒绝编译这一行。你是如何得到你的输出的? – DumbCoder

回答

2

您的代码不会编译。以下是编译和结果,你的愿望代码:你可以选择调用基于指针类型,其中connect版本:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
}; 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     qDebug() << "Baseconnect"; 
    } 
}; 

class AA: public Derived { 
    public: 
    AA() {} 
    virtual ~AA() {} 
}; 

class BB: public Derived { 
    public: 
    BB() {} 
    virtual ~BB() {} 
    AA& connect(AA &a) 
    { 
     qDebug() << "Aconnect"; 
    } 
}; 

例如:

int main(int argc, char *argv[]) 
{ 
    AA* aaptr = new AA; 
    BB* bbptr = new BB; 
    bbptr->connect(*aaptr); // version from BB is called 
    Derived* dptr = new BB; 
    dptr->connect(*aaptr); // version from Derived is called 
    // ... 
} 

作为一个侧面说明,请始终确保您的代码编译和问题已定义良好。否则,您可以缩小回答问题的机会。

+0

谢谢@piotruś。你的回答让我更接近解决我的问题。它真的帮了大忙! – makeMonday