C++ 中的虚拟类和继承
Virtual class and inheritance in c++
我正在使用c ++开发一个新项目:
文件 A.cpp
#ifndef A_hpp
#define A_hpp
class A{
public:
A(int at, int bt);
~A();
virtual double b()=0;
virtual double c()=0;
virtual double g()=0;
private:
int at;
int bt;
};
#endif /* A_hpp */
文件 A.cpp
#include "A.hpp"
A::A(int at, int bt){
this->at=at;
this->bt=bt;
}
A::~A(){
//no code
}
文件 B.hpp
#ifndef B_hpp
#define B_hpp
#include "A.hpp"
class B:public A{
public:
B(int at, int bt, double val);
~B();
private:
double *elems;
};
#endif /* B_hpp */
文件 B.cpp
#include "B.hpp"
#include "A.hpp"
B::B(int at, int bt, double val):A(at, bt){
elems=new double[at*bt];
for(int i=0;i<at*bt;i++)
*(elems+i)=val;
}
B::~B(){
delete []elems;
}
double A::c(){
return *elem;
}
double A::b(){
return (*elem)-*(elem+1);
}
double A::g(){
return (*elem)*(*elem)*(*elem);
}
当我在类 B 中实现这些虚函数 b((、c(( et g(( 时,我收到一个错误,使用未声明的标识符"elem">
问题是您错误地实现了基类虚拟函数的覆盖。
您的代码实际上正在做的是实现A
中的纯虚函数,同时尝试使用来自B
的类成员变量
给定基类:
class A
{
public:
A(int at, int bt);
~A();
virtual double b()=0;
virtual double c()=0;
virtual double g()=0;
private:
int at;
int bt;
};
您的孩子班级应该是:
class B:public A
{
public:
B(int at, int bt, double val);
~B();
virtual double b();
virtual double c();
virtual double g();
private:
double *elem;
};
通过实现这样的B
:
B::B(int at, int bt, double val):A(at, bt)
{
elem=new double[at*bt];
for(int i=0;i<at*bt;i++)
{
*(elem+i)=val;
}
}
double B::a()
{
return *elem;
}
B::~B()
{
delete []elem;
}
double B::b()
{
return (*elem)-*(elem+1);
}
double B::g()
{
return (*elem)*(*elem)*(*elem);
}
有一个错别字。将elem
更改为elems
。
加
要实现虚拟继承,您必须在类B
标头中添加方法:
virtual double b();
virtual double c();
virtual double g();
在实现中,更改命名空间A
B
在.cpp中:
double B::c(){
return *elems;
}
double B::b(){
return (*elems)-*(elems+1);
}
double B::g(){
return (*elems)*(*elems)*(*elems);
}
我认为
您将实现放置在特定B.cpp
文件中误解为"在类 B 中实现某些内容"。如果你写double A::c(){ ...
,你不会在类B
中实现c
,而是在类A
中实现c
,不管你在哪个文件中编写这个实现。而类A
不知道elems
,它是B
的成员,是什么解释了Use of undeclared identifier 'elem'
的错误消息。
改为编写double B::c(){ ...
,并在类B
的定义中声明double c()
。(当然其他功能也是如此(
elems
是类 B 的成员,该类派生自类 A,因此您无法从父级访问子级的成员:
double A::b(){
return (*elems)-*(elems+1); // elems is a member of B not A
}
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 大小虚拟继承中的派生类
- 删除C++继承中虚拟类成员的代码重复
- 重写虚拟函数和继承
- C++ 多级虚拟继承编译问题
- 如何正确获得虚拟继承?
- 编译时继承类中的隐式虚拟与显式虚拟
- 钻石继承虚拟成员铸造与指针
- CPP 继承虚拟方法解析顺序
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 继承虚拟类C 的派生类
- 多个继承/虚拟函数
- 不能从具有虚拟继承(C++虚拟继承)的类派生
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 为什么我不能继承虚拟基的构造函数?
- C++继承虚拟函数崩溃
- c++多重继承/虚拟继承
- 派生类的成员函数是否从基类继承虚拟性?
- 继承虚拟函数的类的boost::optional失败的原因
- c++继承虚拟函数