Вызов базового класса из подкласса

Допустим, у нас есть это:

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 :: draw () и A2 :: draw () соответствуют этому. Что я могу сделать в этой ситуации? Как я могу вызвать ничью А1 ()?

2

Решение

Ты можешь написать 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();
}

Живая демо-ссылка

7

Другие решения

если вы хотите вызвать draw () для A1, вы можете объявить объект 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;
}
2

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

Если вы хотите получить классы, скажем, сделать A2 подкласс A1тогда в вашем объявлении класса вы бы написали class A2: public A1,

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

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

1
По вопросам рекламы [email protected]