<small id='MC5kt'></small><noframes id='MC5kt'>

    <tfoot id='MC5kt'></tfoot>

      <bdo id='MC5kt'></bdo><ul id='MC5kt'></ul>
    1. <i id='MC5kt'><tr id='MC5kt'><dt id='MC5kt'><q id='MC5kt'><span id='MC5kt'><b id='MC5kt'><form id='MC5kt'><ins id='MC5kt'></ins><ul id='MC5kt'></ul><sub id='MC5kt'></sub></form><legend id='MC5kt'></legend><bdo id='MC5kt'><pre id='MC5kt'><center id='MC5kt'></center></pre></bdo></b><th id='MC5kt'></th></span></q></dt></tr></i><div id='MC5kt'><tfoot id='MC5kt'></tfoot><dl id='MC5kt'><fieldset id='MC5kt'></fieldset></dl></div>
      <legend id='MC5kt'><style id='MC5kt'><dir id='MC5kt'><q id='MC5kt'></q></dir></style></legend>

        在 C++ 中为抽象类模板创建接口

        时间:2023-09-26

            <legend id='5y60A'><style id='5y60A'><dir id='5y60A'><q id='5y60A'></q></dir></style></legend>
            <tfoot id='5y60A'></tfoot>

              <small id='5y60A'></small><noframes id='5y60A'>

              <i id='5y60A'><tr id='5y60A'><dt id='5y60A'><q id='5y60A'><span id='5y60A'><b id='5y60A'><form id='5y60A'><ins id='5y60A'></ins><ul id='5y60A'></ul><sub id='5y60A'></sub></form><legend id='5y60A'></legend><bdo id='5y60A'><pre id='5y60A'><center id='5y60A'></center></pre></bdo></b><th id='5y60A'></th></span></q></dt></tr></i><div id='5y60A'><tfoot id='5y60A'></tfoot><dl id='5y60A'><fieldset id='5y60A'></fieldset></dl></div>
                <tbody id='5y60A'></tbody>
                <bdo id='5y60A'></bdo><ul id='5y60A'></ul>
                • 本文介绍了在 C++ 中为抽象类模板创建接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我有如下代码.我有一个抽象模板类 Foo 和两个从模板实例派生的子类(Foo1 和 Foo2).我希望在我的程序中使用可以指向 Foo1 或 Foo2 类型对象的指针,因此我创建了一个接口 IFoo.

                  I have the code as below. I have a abstract template class Foo and two subclasses (Foo1 and Foo2) which derive from instantiations of the template. I wish to use pointers in my program that can point to either objects of type Foo1 or Foo2, hence I created an interface IFoo.

                  我的问题是我不确定如何在接口中包含 functionB,因为它依赖于模板实例化.甚至可以通过接口访问 functionB,还是我在尝试不可能的事情?

                  My problem is I'm not sure how to include functionB in the interface, since it is dependant on the template instantiation. Is it even possible to make functionB accessible via the interface, or am I attempting the impossible?

                  非常感谢您的帮助.

                  class IFoo {
                      public:
                          virtual functionA()=0;
                  
                  };
                  
                  template<class T>
                  class Foo : public IFoo{
                      public:
                          functionA(){ do something; };
                          functionB(T arg){ do something; };
                  };
                  
                  class Foo1 : public Foo<int>{
                  ...
                  };
                  
                  class Foo2 : public Foo<double>{
                  ...
                  };
                  

                  推荐答案

                  您实际上是在尝试不可能的事情.

                  You are actually attempting the impossible.

                  问题的核心很简单:virtualtemplate 不能很好地混合.

                  The very heart of the matter is simple: virtual and template do not mix well.

                  • template 是关于编译时代码生成的.您可以将其视为某种类型感知宏 + 一些元编程技巧.
                  • virtual 是关于运行时决策,这需要一些工作.
                  • template is about compile-time code generation. You can think of it as some kind of type-aware macros + a few sprinkled tricks for meta programming.
                  • virtual is about runtime decision, and this require some work.

                  virtual 通常使用虚拟表(想想列出方法的表)来实现.方法的数量需要在编译时知道,并在基类中定义.

                  virtual is usually implemented using a virtual tables (think of a table which lists the methods). The number of methods need be known at compile time and is defined in the base class.

                  但是,根据您的要求,我们需要一个无限大小的虚拟表,其中包含我们尚未见过的类型的方法,并且只会在未来几年内定义......不幸的是,这是不可能的.

                  However, with your requirement, we would need a virtual table of infinite size, containing methods for types we haven't seen yet and that will only be defined in the years to come... it's unfortunately impossible.

                  如果有可能呢?

                  好吧,这没有意义.当我使用 int 调用 Foo2 时会发生什么?不是为了它!因此它打破了Foo2实现了IFoo中所有方法的原则.

                  Well, it just would not make sense. What happens when I call Foo2 with an int ? It's not meant for it! Therefore it breaks the principle that Foo2 implements all the methods from IFoo.

                  所以,如果你能说出真正的问题会更好,这样我们可以在设计层面而不是技术层面为你提供帮助:)

                  So, it would be better if you stated the real problem, this way we could help you at a design level rather than at a technical level :)

                  这篇关于在 C++ 中为抽象类模板创建接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何在 C++ 中实现接口? 下一篇:如果从不通过它们修改对实际 const 对象的引用,是否允许 const-casting 掉其常量性?

                  相关文章

                • <tfoot id='Ygu42'></tfoot>
                    <bdo id='Ygu42'></bdo><ul id='Ygu42'></ul>

                  <small id='Ygu42'></small><noframes id='Ygu42'>

                  <i id='Ygu42'><tr id='Ygu42'><dt id='Ygu42'><q id='Ygu42'><span id='Ygu42'><b id='Ygu42'><form id='Ygu42'><ins id='Ygu42'></ins><ul id='Ygu42'></ul><sub id='Ygu42'></sub></form><legend id='Ygu42'></legend><bdo id='Ygu42'><pre id='Ygu42'><center id='Ygu42'></center></pre></bdo></b><th id='Ygu42'></th></span></q></dt></tr></i><div id='Ygu42'><tfoot id='Ygu42'></tfoot><dl id='Ygu42'><fieldset id='Ygu42'></fieldset></dl></div>

                  <legend id='Ygu42'><style id='Ygu42'><dir id='Ygu42'><q id='Ygu42'></q></dir></style></legend>