如何使用虚函数对基类进行抽象
How to make abstraction for Base class using virtual functions?
我有以下结构
class Base
{
public:
Base(Type);
virtual render
}
class A
{
public:
Base(Type == A);
void render()
}
class B
{
public:
Base(Type == B);
void render()
}
void client_function()
{
Base baseObject(A);
//Base is an instance of class A
baseObject.render()//runs class A render
}
据我所知,上面的代码中有一些东西不是c++,它们与Haskell中的模式匹配密切相关,但这是我能找到的最好的方式来说明我的问题,而不知道答案;)
在写作中,我希望客户端能够创建一个基本对象,并将对象的类型作为参数传递,对象的正确规范被返回,客户端不需要关心它,只知道运行渲染将运行正确的特定渲染。
如果我没有讲清楚,请随时提问:)
我认为你需要阅读有关虚函数和继承的知识:
http://www.parashift.com/c + + -faq-lite/virtual-functions.html
http://www.parashift.com/c + + -faq-lite/proper-inheritance.html
http://www.parashift.com/c + + -faq-lite/abcs.html
您需要运行时多态性。构造函数没有多少重要的部分。你必须把Base
继承成A
和B
。例如:
class Base
{
public:
virtual void render (); // <--- declare 'virtual'
virtual ~Base(); // <--- very much needed to avoid undefined behavior
};
class A : public Base //<---- inheritance
{
public:
void render(); // <--- this also becomes 'virtual'
};
...
现在你可以根据你的需要使用
Base *baseObject = new A(); // <----- need to use pointer (or reference)
(*baseObject).render(); // <--- other way to write: baseObject->render();
delete baseObject;
我不太明白你的问题。在c++中,不能在运行时选择基类,但是可以让基类依赖于派生类。这是通过使用模板和所谓的好奇循环模板模式来完成的:
template <typename T> class Base {
public:
virtual void render(T *) {}
};
class A : public Base<A>
{
public:
void render(A * t) {}
};
class B : public Base<B>
{
public:
void render(B * t) {}
};
void client_function() {
A a1;
A a2;
a1.render(&a2); // calls A::render
a1.Base<A>::render(&a2); // calls Base<A>::render
Base<A> * ba = &a1;
ba->render(&a2); // calls A::render
}
希望这能回答你的问题
你所要求的正是继承的目的:从专门化功能的类层次结构中创建对象。
在您的示例中,除了语法问题之外,事情将如您所期望的那样工作,即方法A::render
将被调用,即使您在编译时不知道该对象声明为Base
,实际上是A
。这就是虚拟继承的魔力。
相关文章:
- 如何定义一个纯抽象基类
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 从抽象基类中获取重载函数
- 如何构建一个 Map,其中键是抽象基类(而不是值)
- 无法调用纯抽象基类超载
- 私下继承C++抽象基类是什么意思
- 如何在抽象基类中实现运算符+
- 如何为抽象基类创建模板实例化?
- 崩溃 __cxxabiv1::__cxa_pure_virtual () - vtable ptr 到抽象基类
- CRTP - 是否可以创建一个抽象基类?
- 嵌套抽象基类的泛型模板
- 抽象基类的派生类未正确覆盖基纯虚拟方法
- 在C 中的数组中存储抽象基类的不同派生类的对象
- "Has a" C++关系,最佳做法是让一个类"implement"多个抽象基类?
- C++ 重新定义抽象基类