如何使用虚函数对基类进行抽象

How to make abstraction for Base class using virtual functions?

本文关键字:抽象 基类 何使用 函数      更新时间:2023-10-16

我有以下结构

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继承成AB。例如:

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。这就是虚拟继承的魔力。