继承和调用成员函数

时间:2015-01-09 19:49:41

标签: c++ inheritance

我是面向对象程序的新手,所以也许这是一个基本问题,但我很感激您提供的任何帮助。

如果我有一个从类A派生的类B,那么类B的对象是否有某种方法可以从类A的成员函数中访问类B的成员函数?所以在下面的例子中,如果最初调用function1的对象是B类,我可能会在function1中调用function2。这是可能的,如果是这样,我该如何实现呢?谢谢!

   class A
    {
    public:
        int a;
        int b;
        A(){}
        A(int a, int b) { this->a = a; this->b = b; }
        int function1();// { call function2 if class B } 
    };
    class B : public A
    {
    public:
        int c;
        int d;
        B(){}
        B(int c, int d) { this->c = c; this->d = d; }
        int function2(); 
    }; 

3 个答案:

答案 0 :(得分:4)

A内的一个函数并不知道扩展B的类A存在以及它有哪些方法。

为了能够从A中调用B中实现的特定方法,您需要在A中将其声明为virtual,可能是纯虚拟(= 0)。

class A {
  protected:
    virtual void function2() = 0;

  public:
    void function1() { this->function2(); }
}

class B : public A {
  protected:
    void function2() override { ... }
}

在运行时解析virtual方法,这意味着在调用时,将执行调用它的对象的更具体的实现。纯virtual方法没有任何基本实现,这使得A抽象并禁止其实例化。

编辑:最后一点,不要从基础构造函数或析构函数中调用virtual方法。这是危险的,也是一种不好的做法,不是这是你的情况,但你永远不知道。

答案 1 :(得分:1)

是。您需要将function2()定义为A类中的虚函数。然后,如果对象实际上是{{1},则从function1调用它将导致调用B function2() }}。例如:

B

如果 class A { public: int a; int b; A(){} A(int a, int b) { this->a = a; this->b = b; } int function1() { return this->function2(); } virtual int function2() { return 0; } }; class B : public A { public: int c; int d; B(){} B(int c, int d) { this->c = c; this->d = d; } int function2() override { return 999; } }; 的{​​{1}}没有明智的实现,那么拥有function2对象永远不会有意义。您可以通过声明A为纯虚拟来表达这一点; e.g。

A

答案 2 :(得分:0)

virtual允许您覆盖父类中的函数。

class A
{
public:
    A(){}
    A(int a, int b):a(a), b(b) {}
    int function1() { return this->function2(); } 
    virtual int function2() { //what function2 in parent class should do }
private:
    int a;
    int b;
};
class B : public A
{
public:
    B(){}
    B(int c, int d):c(c), d(d) {}
    int function2() { //what function2 in child class should do }
private:
    int c;
    int d;
};