从子类调用基类

时间:2014-08-29 11:19:21

标签: c++ superclass method-call

让我们说有这个:

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的抽奖()?

3 个答案:

答案 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();
}

Live demo link

答案 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)

你的问题在于没有类层次结构。您声明了两个类:A1A2。但是,在main中,您声明了一个类型为A的对象,您从未定义过该对象!

如果你想派生类,比如说make A2A1的子类,那么在你的类声明中你会写class A2: public A1

如果您希望A2覆盖A1的行为,请不要忘记为每个类实现draw方法的每个实例。

在方法之前使用范围解析运算符来指定要调用的类,例如:a.A1::draw();