2015-01-09 84 views
0

我对于面向对象的程序来说相当陌生,所以也许这是一个基本问题,但我会很感激您可以提供的任何帮助。继承和调用成员函数

如果我有一个从类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(); 
    }; 

回答

1

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

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; } 
    }; 

如果没有为A明智实施function2,那么它将永远是有意义的有一个A对象。你可以通过声明function2为纯虚拟表达方式;例如

virtual int function2() = 0; 
4

A一个功能不具有哪些方法有一个事实,即延伸AB存在,并且想法。

为了能够调用B中从A实现的特定方法,您需要在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方法。这是危险的和不好的做法,不是这是你的情况,但你永远不知道。

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; 
};