我可以从C ++派生实例访问指向基本实例的指针吗?

时间:2019-01-01 20:22:57

标签: c++

  1. 我有一个基类和一个派生类,以及一堆定义为virtual的方法,这些方法在派生类中被重写。
  2. 我将派生类的实例分配给基本指针“ myPointer”,因此将调用派生类的虚拟方法。
  3. 是否可以将“ myPointer”“广播”到指向实际基本实例的指针,并因此通过新的“ casted指针”调用基本虚拟方法?
  4. 我了解myPointer->Base::MyMethod();,所以这不是我想要的。我想做类似的事情:

    Base* myPointer = new Derived();
    Base* actualBasePointer = (some kind of case) myPointer;
    actualBasePointer->MyMethod(); // this invokes the base virtual method. 
    

3 个答案:

答案 0 :(得分:2)

Base*Base*。没有可以禁用虚拟调度/多态性的“变量”,也没有一种类型的类型转换可以为您提供一种不同的指针。

您的功能是virtual还是不是,如果您可以打开和关闭该功能,那真是令人困惑。

相反,您的类中具有替代的非虚拟函数可以满足您的需求。我建议您找到一种制作这些private的方法,以避免与现有的public虚拟函数产生混淆-通常这意味着它们将仅用于实用程序/内部目的。如果这意味着您不能将它们用于实现自己的目标,建议您检查一下自己的方法。

或者,坚持使用清晰而著名的myPointer->Base::MyMethod() -简单地了解它似乎不是不使用它的充分理由。

答案 1 :(得分:0)

尽管就非静态数据成员而言,派生类对象由其基类对象组成,但虚拟方法与其在派生类(或基类,如果不是方法)中的实现之间的连接已覆盖),并与派生的类对象紧密耦合。因此,无法像生成基类对象的视图一样生成“对对象的vtable的视图”。您可以通过编写myPointer->Base::MyMethod()来直接引用方法的特定实现,但这必须在每次调用中明确表示,并且如果Base::MyMethod()本身调用其他虚拟方法,则它不会禁止动态绑定。

要实现派生类对象的行为类似于基类对象的唯一方法是使用对象切片,即将派生类对象分配给基类的实例(而不是指针或引用):

class Base {
public:
    int x = 10;

    virtual void printX() const {
        printInt(x);
    }
protected:
    virtual void printInt(int i) const {
        cout << "Base_printInt: " << i;
    }
};

class Derived : public virtual Base {
protected:
    virtual void printInt(int i) const override {
        cout << "Derived_printInt: " << i;
    }

};

int main() {
    Derived d;

    Base b = static_cast<Base>(d);

    b.printX();
}

输出:

Base_printInt: 10

答案 2 :(得分:0)

否,您不能以任何这种方式禁用虚拟调度。
但是,如果您确实需要这种行为,我建议您采用这种设计模式。

mb.place(x=horizontal_pos, y=vertical_pos)

这样,您就可以做....

random.uniform()