让我们说有这个:
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()都与此匹配。在这种情况下我该怎么办?我如何调用A1的抽奖()?
答案 0 :(得分: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();
}
答案 1 :(得分:2)
如果你想调用A1的draw(),你可以声明一个A1的对象并调用该函数。
A1 a;
a.draw();
同样,A2
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 :(得分:1)
你的问题在于没有类层次结构。您声明了两个类: A1
和A2
。但是,在main中,您声明了一个类型为A
的对象,您从未定义过该对象!
如果你想派生类,比如说make A2
是A1
的子类,那么在你的类声明中你会写class A2: public A1
。
如果您希望A2覆盖A1的行为,请不要忘记为每个类实现draw方法的每个实例。
在方法之前使用范围解析运算符来指定要调用的类,例如:a.A1::draw();