gpt4 book ai didi

c++ - 从(模板)基类内部调用虚拟成员函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:09 25 4
gpt4 key购买 nike

假设我有以下内容:

#include <iostream>
#include <string>

template<class T>
class base
{
public:
void print()
{
T t = get();
std::cout << t << std::endl;
}

virtual T get() const
{
// assumes T can be constructed from, say, -1
T t = -1.0;
return t;
}
};

class derived : public base<std::string>
{
public:
virtual std::string get() const
{
// this is a silly example, but one can
// imagine that what we return here could
// depend on data members of derived
return "this is a string";
}
};

int main()
{
derived d;
d.print();

return 0;
}

在我看来 d.print() 应该调用 derived::get() 因为 get() 是虚拟的。但是,我收到一个编译器错误,提示我无法将 string 初始化为 -1.0,这意味着编译器正在尝试调用 base: :get() 当我调用 d.print() 时。怎么回事?

最佳答案

However, I'm getting a compiler error saying that I can't initialize a string to -1.0, which means that the compiler is trying to call base::get() when I call d.print().

不,那个编译器错误意味着编译器正在尝试实例化 base<std::string>::get() ,它必须这样做,因为 derived使用 base<std::string>作为基类。仅仅因为您不调用函数并不意味着您不能。您仍然可以调用 base<std::string>::get()直接。

你实例化了base<std::string>并将其用作基类。自 base<std::string>::get()是一个虚函数,您使用 base<std::string> 的事实将其视为“已使用”作为基类。既然要用,就必须实例化。因此编译器必须并且将会尝试编译该函数。

std::string不能从 float 隐式构造,编译器会因模板替换失败而出错。

关于c++ - 从(模板)基类内部调用虚拟成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8091302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com