c++;继承虚函数 我试图在C++中学习继承。我写了一些代码来学习虚拟函数 #include <iostream> using namespace std; class A { int a; public: A() {} virtual int get_count() const = 0; int get_A() { return a; } }; class B : public A{ public: int b; B() {} B(A& base) : b(base.get_count()) {} virtual int get_count() const { return 10; } }; void func(A& base) { B derived(base); cout << derived.b; } int main() { A base; B derived; func(derived); }
你能告诉我我做错了什么吗?你试图用c++;继承虚函数 我试图在C++中学习继承。我写了一些代码来学习虚拟函数 #include <iostream> using namespace std; class A { int a; public: A() {} virtual int get_count() const = 0; int get_A() { return a; } }; class B : public A{ public: int b; B() {} B(A& base) : b(base.get_count()) {} virtual int get_count() const { return 10; } }; void func(A& base) { B derived(base); cout << derived.b; } int main() { A base; B derived; func(derived); },c++,inheritance,virtual,C++,Inheritance,Virtual,你能告诉我我做错了什么吗?你试图用一个基来实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(get_count())假设我尝试调用base.get_count()您尝试用一个base实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(get_count())假设我尝试调用base.get_count()方法virtual int get_count()const=0是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除=0和定义函数(如果需
一个基来实例化一个类型为A的对象代码>。这是不可能的,因为包含纯虚函数。(get_count()
)假设我尝试调用base.get_count()
您尝试用一个base实例化一个类型为A的对象代码>。这是不可能的,因为包含纯虚函数。(get_count()
)假设我尝试调用base.get_count()
方法virtual int get_count()const=0代码>是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除=0
和定义函数(如果需要,请使用空正文):
应该可以工作。方法虚拟整数get\u count()const=0代码>是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除=0
和定义函数(如果需要,请使用空正文):
应该可以工作。您实现A
(如下)的方式使它成为一个抽象基类
class A
{
int a;
public:
A() {}
virtual int get_count() const = 0; // this is a pure virtual function
int get_A() { return a; }
};
它只能用作指向实现纯虚拟函数的派生类的指针:
int main()
{
B derived;
A* pA = new B; // this is okay
delete pA;
return 0;
}
您实现A
(如下)的方式使它成为一个抽象基类
class A
{
int a;
public:
A() {}
virtual int get_count() const = 0; // this is a pure virtual function
int get_A() { return a; }
};
它只能用作指向实现纯虚拟函数的派生类的指针:
int main()
{
B derived;
A* pA = new B; // this is okay
delete pA;
return 0;
}
上面的答案是它不起作用的技术原因,但还有一个更隐秘的问题,那就是设计没有意义。您创建一个B是为了向a添加一些功能。如果您还创建了一个扩展a的C,您真的想将其转换为B吗
遗传的经典例子是动物。斑马和长颈鹿都是动物,所以类层次结构应该是这样的
class Animal
{
stuff
}
class Zebra : public Animal
{
more stuff
}
class Giraffe : public Animal
{
different stuff
}
尽管斑马和长颈鹿都是动物,但把它们变成长颈鹿并没有多大意义。以上的答案是它不起作用的技术原因,但还有一个更隐蔽的问题,那就是设计没有意义。您创建一个B是为了向a添加一些功能。如果您还创建了一个扩展a的C,您真的想将其转换为B吗
遗传的经典例子是动物。斑马和长颈鹿都是动物,所以类层次结构应该是这样的
class Animal
{
stuff
}
class Zebra : public Animal
{
more stuff
}
class Giraffe : public Animal
{
different stuff
}
尽管斑马和长颈鹿都是动物,但把它们变成长颈鹿并没有多大意义。这不是问题所在。他试图创建一个实例作为main的第一个变量,这是一个逻辑错误。应该是派生类的*或&and和实例。如果他创建实例是因为他想这样做呢?:)如果他愿意,他可以这样做。如果是这样,那就不应该是纯粹的虚拟。这是一个设计,它不应该是纯粹的虚拟。这就是我在回答中所说的。那么-出什么事了?:)这不是问题所在。他试图创建一个实例作为main的第一个变量,这是一个逻辑错误。应该是派生类的*或&and和实例。如果他创建实例是因为他想这样做呢?:)如果他愿意,他可以这样做。如果是这样,那就不应该是纯粹的虚拟。这是一个设计,它不应该是纯粹的虚拟。这就是我在回答中所说的。那么-出什么事了?:)