C++ 之处理模板化基类的成员名称
2023-02-18 16:31:01 时间
问题描述
假设有下面这么一段简单的代码,其中定义了两个类模板,一个基类 Animal
,一个派生类 Dog
:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Animal {
protected:
string name_ = "animal";
};
template <typename T>
class Dog : public Animal<T> {
public:
string getName()
{
return name_;
}
};
int main(int argc, char const* argv[])
{
Dog<int> dog;
cout << dog.getName();
return 0;
}
在狗狗类中有个 getName()
方法,返回基类部分的成员 name_
,感觉看上去没什么问题,但是编译的时候却会报错:
问题解决
出现这个问题的原因在于,在 Animal<T>
被实例化之前,编译器无法得知里面是否有 name_
这个数据成员。比如我们自己全特化一个空的 Animal
,这里面就啥也没有:
template <>
class Animal<int> {
};
要想正确访问模板化基类中的成员,有以下三种方法:
-
使用
this
指针,比如this->name_
; -
使用
using
声明,如下述代码所示:template <typename T> class Dog : public Animal<T> { public: using Animal<T>::name_; string getName() { return name_; } };
-
使用
Animal<T>::name_
显式指出成员在基类中,但是这种方法有个缺点,就是访问不了子类重写后的虚函数。
有一点需要指出的是,如果子类重写了模板化父类的虚函数,由于能在子类作用域中找到虚函数的名字,所以不需要 this
指针等方法就能调用该函数,以上~~
相关文章
- kubernetes数据持久化StorageClass动态供给(二)
- kubernetes数据持久化PV-PVC详解(一)
- kubernetes之Ingress发布应用实现rewrite重写并配置HTTPS;(二)
- kubernetes之基于ServiceAccount拉取私有镜像
- Knative部署应用以及应用的更新、应用的分流(三)
- Jenkins配置下载插件源;
- kubernetes之一文详解Ingress;(一)
- Centos7安装Jenkins详解;
- kubernetes之镜像拉取策略ImagePullSecrets;
- kubernetes之镜像拉取策略ImagePullPolicy;
- kubernetes之Endpoint引入外部资源实践;
- 一文搞懂什么是kubernetes Service
- Serverless之Knative部署应用示例(二)
- Serverless之knative1.6安装(一)
- Nginx篇之Ubuntu18.04.3编译安装Nginx
- kubernetes之DaemonSet以及滚动更新 (三)
- kubernetes之资源限制及QOS服务质量
- 一文搞懂kubernetes Deployment之滚动更新、回滚应用及策略;(二)
- kubernetes之Deployment控制器(一)
- kubernetes之ReplicaSet