从派生类访问基类对象

时间:2015-03-19 23:24:26

标签: c++ inheritance

我可能理解遗传错误,但如果:

我有一个名为Base的基类和一个名为Derived的派生类Base,

在Derived类的函数中,我可以访问Derived类的Base对象吗? 我想有点像*这个但对象类型Base?

编辑:我在Derived类中重写了一个函数Base :: foo(),但在这个重写函数Derived :: foo()中我想用Base对象调用原始函数。

Derived :: foo()const {

double Derived::foo() const {
  // s is a variable only associated with Derived
  double x;
  x = s + Base.foo(); // this is the line i dont know what im doing?!
  return x;
}

2 个答案:

答案 0 :(得分:6)

Derived*可隐式转换为Base*,因此您可以这样做:

const Base *base = this;

虽然您通常不需要这样做,因为Base的任何成员都由Derived继承。

但如果foo()是虚拟的,那么这样做:

const Base *base = this;
base->foo();

或等效地:

static_cast<const Base*>(this)->foo();

不会拨打Base::foo()而是Derived::foo()。这就是虚函数的功能。如果要调用特定版本的虚拟函数,只需指定哪一个:

this->Base::foo(); // non-virtual call to a virtual function

当然,this->部分并非真正必要:

Base::foo();

可以正常工作,但有些人更喜欢添加this->,因为后者看起来像是对静态函数的调用(我对这个问题没有偏好)。

答案 1 :(得分:1)

要调用您要覆盖的基类函数,请调用Base::Fun(...)

您执行以下Base::foo(),这是完整的代码示例:

class Base
{
public:
    virtual double  foo() const
    {
        return 5;
    };
};

class Derived : Base
{
    int s;

public:

    Derived() : s(5)
    {
    }

    virtual double  foo() const
    {
        // s is a variable only associated with Derived
        double x;

        //NOTE THE Base::foo() call
        x = s + Base::foo(); // this is the line i dont know what im doing?!
        return x;
    }
};