C 基本方法称为而不是派生方法
C++ base method called instead of derived method
所以,我知道这样的东西很多,但是其他答案似乎表明此应该有效,所以我想我会问我我的代码专门。我在.net和java上花费更多的时间,所以也许我忘记了一些东西。
我正在创建一个基本小部件和一组特定的小部件(按钮,其他图形项目)。我正在尝试循环浏览链接的小部件列表,而我想要的是用于调用该特定小部件的特定渲染方法。以下是简化的代码,证明了我的问题,在我第一次调用渲染时,调用了特定的渲染函数。如果我将CgeneralWidget指针传递给调用渲染对象的函数,则调用基本方法。我认为,只要我发送指针,C 就足够聪明,可以知道该对象的真实是什么,并将其称为"覆盖方法"。
否则,处理基本对象集合并适当调用派生方法的正确方法是什么?
谢谢。
class cGeneralWidget
{
public:
void Render()
{
int a = 99;
}
};
class cSpecificWidget : public cGeneralWidget
{
public:
void Render()
{
int a = 99;
}
};
void GeneralRenderingFunction(cGeneralWidget * b)
{
b->Render(); // <-- calls the base function
}
int main(int argc, char* argv[])
{
cSpecificWidget wd;
wd.Render(); // <-- calls the derived function
GeneralRenderingFunction(&wd);
return 0;
}
您应该使用virtual
关键字在基类中定义render()方法,并使用override
关键字在派生类中。如果您不将virtual
关键字放在基类实现中,则C 不会将其标记为虚拟。
class cGeneralWidget
{
public:
virtual void Render()
{
int a = 99;
}
};
class cSpecificWidget : public cGeneralWidget
{
public:
void Render() override
{
int a = 99;
}
};
在您的基类中
class cGeneralWidget
{
public:
virtual void Render()
{
int a = 99;
}
};
渲染必须是虚拟的,所以它覆盖了
注意:虚拟函数一个在基类中声明并通过派生类重新定义(Overriden)的成员函数。当您使用指针或对基类的引用引用派生的类对象时,您可以调用该对象的虚拟函数并执行派生的类的函数版本。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 为什么此派生对象无法访问基类的后递减方法?
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 在派生类中使用基类的私有成员变量的最佳方法
- 如何在从抽象基派生的类中实现相同的方法?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 从基类实例调用派生类方法而不进行强制转换
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- C++ 使用派生类方法更改基类数据成员
- 如何使用派生类特定的方法:派生类中的派生成员
- 使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的