2014-08-29 3 views
2

Допустим, мы имеем следующее:Вызов базового класса из подкласса

class A1 
{ 
    public: 
     void draw(){} 
}; 

class A2 
{ 
    public: 
     void draw(){} 
}; 

class A : public A1, public A2 
{}; 

void main() 
{ 
    A a; 
    // I want to invoke the draw() of A1. How can I do that? 
} 

Если я просто делаю что-то вроде a.draw() он не будет препятствовать мне, потому что оба A1 :: Жеребьевка() и А2: : draw() соответствует этому. Что я могу сделать в этой ситуации? Как я могу вызвать draw()?

+6

Что такое 'A' здесь? Это даже не объявлено. –

+0

Попробуйте, по крайней мере, скомпилировать свой код перед отправкой, это даже не имеет смысла. – user657267

+0

Вы понимаете, что нельзя использовать метод draw A1 без экземпляра A1? – doctorlove

ответ

7

Вы можете написать a.A1::draw();

#include <iostream> 

class A1 
{ 
public: 
    void draw(){ std::cout << "A1::draw()"; } 
}; 

class A2 
{ 
public: 
    void draw(){ std::cout << "A2::draw()"; } 
}; 

class A : public A1, public A2 
{}; 

int main() 
{ 
    A a; 
    a.A1::draw(); 
} 

Live demo link

+0

Его нет. Я редактировал сообщение. Я забыл что-то добавить. Еще раз проверьте – TheCrafter

+0

@ TheCrafter: как насчет сейчас? –

+0

Да, это работает сейчас. Большое спасибо. Я понимаю, как указать, какой из них использовать. Спасибо за вашу помощь. – TheCrafter

1

Ты проблема заключается в том, что не существует никакой иерархии классов. Вы объявили два класса: A1 и A2. Однако в основном вы объявляете объект типа A, который вы никогда не определяли!

Если вы хотите получить классы, скажите, сделайте A2 подкласс A1, затем в декларации вашего класса вы должны написать class A2: public A1.

Не забудьте реализовать каждый экземпляр метода draw для каждого класса, если вы хотите, чтобы A2 переопределил поведение A1.

Используйте оператор разрешения области видимости перед методом, чтобы указать, какой класс вы хотите позвонить, например: a.A1::draw();

+0

Это была неправильная толкование. Обновите страницу и снова проверьте мой пост. Кстати, я уже получил свой ответ. Спасибо за ваши усилия. – TheCrafter

2

, если вы хотите позвонить рисовать() А1, вы можете объявить объект A1 и вызовите функция.

A1 a; 
a.draw(); 

Аналогично, А2

A2 a; 
a.draw(); 

Однако, я полагаю, вам вызвать функцию для вызова функции базового класса из объекта производного класса. Итак, вот код для того же ...

#include <iostream> 

class Base{ 
    public: 
    void foo(){std::cout<<"base";} 
}; 

class Derived : public Base 
{ 
    public: 
    void foo(){std::cout<<"derived";} 
}; 

int main() 
{ 
    Derived bar; 
    //call Base::foo() from bar here? 
    bar.Base::foo(); // using a qualified-id 
    return 0; 
} 
Смежные вопросы