相信大家都对继承很清楚,那么如果是父类为模板类,派生出来的子类创建的对象,具体实现要如何调用父类的方法呢?
我们用代码尝试一下
#include<iostream>
#include<string>
template<typename T>
class Base {
public:
void bar() { std::cout << "111" << std::endl; };
};
template<typename T>
class Derived : public Base<T> {
public:
void foo()
{
this->bar();
//bar();//错误写法,访问不到
}
};
class A {
public:
void bar() { std::cout << "111" << std::endl; };
};
class B :public A {
public:
void foo()
{
bar();
}
};
int main()
{
Derived<int> i;
i.foo();
i.bar();
B v;
v.bar();
v.foo();
return 0;
}
结果是111 111 111 环境为:windows,MSVC,c++20,debug,x86
我们这是正确的写法,大家可以看出来,如果父类为模板,得使用this指针来强调访问。
如果我们不使用this,那么看看报错结果
先看一下书上对此类似的描述
我们详细说一下:
对于在模板的定义中所使用的非待决名,当检查该模板的定义时将进行无限定的名字查找。
在这个位置与声明之间的绑定并不会受到在实例化点可见的声明的影响。而对于在模板定义中所使用的待决名,它的查找会推迟到得知它的模板实参之时。
写下bar()的时候,它被判定位非待决名,于是在检查该模板定义的时候,也就是没实例化的时候就查找名字,没找到的话就报错未定义了。
如果写上this->bar构成待决名,它的查找推迟到知道模板实参,也就是实例化的时候。
如果不清楚什么是待决https://zh.cppreference.com/w/cpp/language/dependent_name可以看看文档对此的描述.