Уникальный экземпляр обычно наследуемого базового класса - PullRequest
0 голосов
/ 24 января 2012

У меня следующая структура класса:

class Common {
//members and data here.
};

class Derived1 : public Common 
{
};

class Derived2: public Common, public Derived1
{
};

Насколько я понимаю, в этой иерархии как Derived1, так и Derived2 будут использоваться любые члены из Common.Есть ли способ сделать Derived1 приватным в Derived2, чтобы Derived2 все еще наследовал от Common, но имел отдельные переопределения функций.По сути, мне нужно переопределить виртуальную функцию в Derived1 и Derived2, но при этом все еще выполняется функция Derived1 (это потоковый API).Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 24 января 2012

Этого можно добиться даже с помощью одного наследования:

struct Base
{
    virtual void foo() = 0;
    virtual ~Base() { }
};

struct Intermediate : Base
{
    virtual void foo() { /* ... */ }
    // ...
};

struct Derived : Intermediate
{
    virtual void foo()
    {
        Intermediate::foo();
        // new stuff
    }
};
0 голосов
/ 21 июля 2017

Вы пытались использовать виртуальные функции для полиморфизма времени выполнения и присваивать переменную вашего Derived2 класса указателю Derived1 class

class Common {
//members and data here.
public:
    virtual void commonFunction() = 0; //keeping it pure virtual
};

class Derived1 : public Common 
{
    virtual void commonFunction(){
        //do something in derived1
    }
};

class Derived2: public Common, public Derived1
{
    void commonFunction(){
        //do something in derived2
    }
};
int main(){
    Derived2 derived2;
    Derived1 *derived1;
    derived1 = &derived2;
    derived1->commonFunction(); //calls the common function definition in Derived1 
 /* ... */
}
0 голосов
/ 24 января 2012

Как указывает @Walkerneo, вам не нужно наследовать от Common и Derived1.Вы можете просто наследовать от Derived1, и вы также получите наследование от Common.Вы можете явно вызвать метод Derived1 из метода Derived2, выполнив следующие действия:

void Derived2::overriddenMethod ()
{
    // Do something unique here
    Derived1::overriddenMethod ();
    // Maybe do some more stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...