c++ - 具有不同签名的多态性和重载函数

标签 c++ class templates polymorphism

我想做的:一个简单的存储类,定义为尽可能通用的模板。并且能够从此类派生出另一个可以接受任何内容的类,将其转换为 int(算法与此处无关),并将其存储在基础类中。

但是,这并不像预期的那样有效。这是我写的最小测试用例:

template<typename T>
class A {
  public:
    void f(T& foo) { }
};

class B : public A<int> {
  public:
    template<typename T>
    void f(T& foo) { }
};

int main() {
  A<int>* ptr = new B;
  ptr->f("foo");
  delete ptr;
  return 0;
}

当然,这是行不通的:

pierre@raringbeast:~/Workspace/Test/src$ icpc -o Test Test.cpp 
Test.cpp(16): error: a reference of type "int &" (not const-qualified) cannot
be initialized with a value of type "const char [4]"
    ptr->f("foo");
           ^

compilation aborted for Test.cpp (code 2)

有没有办法强制编译器使用 B 类中的方法定义,或者这是一个真的坏主意?

--

编辑:将继承公开。

最佳答案

首先,正如@GermanDiago 指出的那样,您正在使用私有(private)继承,因此您会遇到“基类不可访问”错误。更改 BA<int> 派生公开。

即便如此,这也无法解决问题。名称查找基于静态类型。当你有一个指向 A<int> 的指针时, 通过该指针访问成员只会查看 A<int> 的成员.

您必须通过类型 B 访问看B的成员:

int main() {
  B* ptr = new B;
  ptr->f("foo");
  delete ptr;
  return 0;
}

当然,如果我没有正确理解你的问题,这并不是你真正想要的。你可能会看看 Curiously Recurring Template Pattern相反。

template <class T, class Derived>
class A {
  public:
    template <class U>
    void f(U& bar) {
      static_cast<Derived*>(this)->f(bar);
    }

    void f(T& foo) {

    }
};


class B : public A<int, B>
{
  public:
    template <class T>
    void f(T &foo) {
      //will be called from A's f(U&)
    }
};


int main() {
  A<int, B>* ptr = new B;
  ptr->f("foo");
  delete ptr;
  return 0;
}

Live example

当然,这有一个缺点 B成为 A 的一部分的类型。我认为没有办法在仍然保持编译时间的情况下解决这个问题。

关于c++ - 具有不同签名的多态性和重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268370/

相关文章:

c# - 将 C++ 结构转换为 C# 以用于 UDP 通信

Java - 如何将类中的值设为 'return'

java - 是否可以使用复杂的 XML 模板文件动态生成 Android UI?

java - Java 中的二维 HashMap (以及一般情况下)

c++ - 未调用 dll Hook 函数

c++ - 如何获得最小的 SDL 程序以在 visual studio 2008 express 中编译和链接?

linux - 具有带模板参数的函数的模板类上的 Cppcheck 语法错误

c++ - 如何使用最新版本的 ffmpeg 创建立体声 mp3 文件?

ruby - 在 Ruby 中使用面向对象的方法

javascript - JS改变倒计时计数器