c++ - 多态性和覆盖 C++ 类模板中的方法

标签 c++ templates polymorphism overriding

<分区>

我想要一个包含我的方法的基本实现的类模板,以及一组使用具有特定类型(double、int、char*)的模板类的子类,并根据需要覆盖这些基本实现的某些子集.但是,除非我将对象声明为子类的实例,否则我重写的方法似乎不会被调用。在探索这个问题时,我想出了以下代码:

#include <iostream>

template <typename T>
class BaseClass {
public:
    virtual void print1 (T thing) {
        std::cout << "Base print1: " << thing << std::endl;
    }

    virtual void print2 (T thing) {
        std::cout << "Base print2: " << thing << std::endl;
    }
};

class IntClass : public BaseClass<int> {
public:
    void print2 (int thing) {
        std::cout << "Int print2: " << thing << std::endl;
    }
};

int main()
{
    BaseClass<int> thing = IntClass();
    thing.print1(1);
    thing.print2(1);

    IntClass thing2 = IntClass();
    thing2.print1(2);
    thing2.print2(2);

    return 0;
}

我的预期输出是:

Base print1: 1
Int print2: 1
Base print1: 2
Int print2: 2

但相反,我得到:

Base print1: 1
Base print2: 1
Base print1: 2
Int print2: 2

是否有可能在这里实现我的目标,或者在这种情况下我最好为每种类型创建单独的基类?如果我的术语有点偏离,我深表歉意 - 我是 C++ 的新手。

最佳答案

thing 的类型是BaseClass<int> , 不是 IntClass .临时IntClass复制BaseClass后,你用来初始化它已被销毁子对象。像这样复制对象的一部分有时称为切片

当您使用指向基类的引用或指针时,多态性起作用,这可能引用派生类的对象。因此,您将通过引用 IntClass 获得预期的结果。对象:

// In C++11 or later, you can bind an rvalue reference to a temporary, extending its lifetime
BaseClass<int> && thing = IntClass();

// If you're stuck in the past, you can bind an lvalue reference to a variable
IntClass ic;
BaseClass<int> & thing = ic;

关于c++ - 多态性和覆盖 C++ 类模板中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891191/

相关文章:

c++ - 使用运算符(operator)转发整个类(class)

c++ - 隐藏函数模板,声明特化

perl - 为什么我的 Perl CGI 程序显示的是程序代码,而不是输出?

f# - 在 F# 中使用对象代数模拟高级多态性

c++ - 返回基类类型的引用时捕获派生异常?

C++ const 语义引用

C++ 声明一个变量两次

c++ - 在 boost graph lib 中,如何在不遍历该顶点的所有出边的情况下获得顶点的特定出边?

java - Jackson 多态反序列化为特定子类型失败,错误代码为 "InvalidTypeIdException"

javascript - 关于NodeJS缓冲区