C++编写抽象类和派生类遇到的问题

问题描述 投票:0回答:1

当我实现一个数据结构时,我遇到了以下使用未声明的标识符“a”的问题。 a不是继承自基类吗?为什么我无法访问?

#pragma once
#include <iostream>
template <typename T> class A {
public:
  T a;
  virtual void show() = 0;
};

template <typename T> class B : public A<T> {
public:
  B() { a = 0; }
  void show() { std::cout << "Hello, world!" << std::endl; }
};

但是当我添加this指针时,并没有出现错误信息:

#pragma once
#include <iostream>
template <typename T> class A {
public:
  T a;
  virtual void show() = 0;
};

template <typename T> class B : public A<T> {
public:
  B() { this->a = 0; }
  void show() { std::cout << "Hello, world!" << std::endl; }
};

为什么???

c++ abstract-class
1个回答
0
投票

当您编写

this->a
时,您明确告诉编译器在当前实例的范围内查找成员
a
。这有助于编译器正确解析名称,即使在具有潜在范围模糊性的模板上下文中也是如此。

在你的第一个例子中;

B() { a = 0; }

编译器在类

a
的构造函数中遇到
B
,并尝试在类
a
的范围内查找
B
。但是,由于
a
是从类
A<T>
继承的,因此它被视为依赖名称,需要使用
this->
来指示正确的范围。

在你的第二个例子中;

B() { this->a = 0; }

您明确使用

this->a
来指示
a
是当前实例的成员。这解决了范围歧义,并让编译器知道
a
是从基类继承的。

© www.soinside.com 2019 - 2024. All rights reserved.