虚基类不能被实例化吗

抽象类肯定不行,但虚基类是在派生防止重复才定义的,有不能定义这种说法?为什么不能生成对象?

一、虚基类是为了防止有共同基类的基类的派生类重复生成共同基类的成员而产生的,注意,这里使用了两个基类,一个派生类,有三个层次的类!第一个基类才是根,第二个基类实际指的是虚基类,它是第一层次基类的派生类,但是第三层次类的基类;
二、虚基类本身能够被实例化,可以产生对象。如下面:
#pragma once
//定义基类,包括构造函数共二个函数,两个数据成员姓名和年龄

class cbase
{
public:
void displaybase();
cbase(char*,int);
private:
char* m_cStudent;
int m_nAge;
};
//定义虚基类,这里省略继承方式,默认为private.两个成员函数,两个

//数据成员学号和座次
class student: virtual cbase
{
public:
void displaystudent();
student(int ,int ,char* ,int );
private:
int m_nSchoolNumb;
int m_nSeat;
};
//定义成员函数
#include "stdafx.h"
#include<iostream>
#include "myclass.h"
using namespace std;

void cbase::displaybase()

{
cout<<"姓名:"<<m_cStudent<<endl;
cout<<"年龄:"<<m_nAge<<endl;
}
cbase::cbase(char* cname,int nage)
{
m_cStudent=cname;
m_nAge=nage;
}
void student::displaystudent()
{
displaybase();
cout<<"学号:"<<m_nSchoolNumb<<endl;
cout<<"座次:"<<m_nSeat<<endl;
}
//这里换了一种方式定义,全部用参数初始化列表
student::student(int nseat ,int numb,char* cname,int nage):
cbase(cname,nage),m_nSeat(nseat),m_nSchoolNumb(numb){}

//主函数:
#include "stdafx.h"

# include "myclass.h"
int _tmain(int argc, _TCHAR* argv[])

{
cbase mybase("Jon",18);
mybase.displaybase();
student mystudent(12,22,"Tom",99);
mystudent.displaystudent();
return 0;
}
(说明:以上程序用vs2008编译的。)
三、当一个派生类(D)由两个有共同基类(A)的基类(B、C)(比较拗口吧)派生时,如果这两个基类是普通基类,则每一个基类都会调用它自己的基类A的构造函数,生成一份它自己的基类的成员。那么派生类在实例化时会生成两份A基类的成员,一份B基类的成员,一份C基类的成员。在一般情况下,生成二份A基类的成员没必要吧,而且浪费空间。为了解决这个问题,C++使用了虚基类的概念。当派生类的基类是虚基类时,不管你是多重继承还是单重继承,编译器在编译时,派生类构造函数在调用其基类的构造函数时,都会忽略基类构造函数中对其基类构造函数的调用(又拗口吧),所以,C++规定,在派生类中要显式地调用共同基类的构造函数。
温馨提示:内容为网友见解,仅供参考
无其他回答

虚基类不能被实例化吗
二、虚基类本身能够被实例化,可以产生对象。如下面:pragma once \/\/定义基类,包括构造函数共二个函数,两个数据成员姓名和年龄 class cbase { public:void displaybase();cbase(char*,int);private:char* m_cStudent;int m_nAge;};\/\/定义虚基类,这里省略继承方式,默认为private.两个成员函数...

什么是虚基类(在c++中)?
当一个类被声明为虚基类时,表明该类可以在派生层次结构中作为中间层次的基类使用,但本身不用于直接实例化对象。其主要作用是充当构建多层次派生类的基石。虚基类的详细解释 在C++的多继承场景中,如果两个或多个派生类继承自同一个基类,可能会遇到一些问题。特别是当这些派生类还需要进一步继承其他类时...

下列有关继承和派生的叙述中,正确的是( )。
【答案】:C 派生类可以访问基类的保护成员,而不能访问基类的私有成员。作为虚基类的类可以被实例化。虚函数如果没有派生类中重新实现,那么仍然使用基类的成员函数。

什么叫做虚基类,它有何作用
虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。.虚基类是用来在多继承中,如果父类继承自同一个父类,就只实例化一个父类(说的有点绕,就是只实例化一个爷爷的意思。设置虚基类的目的是提高程序运行效率。当在多条继承路径上有一个公共的基类,在这些路径中...

C++中,虚基类是如何避免两义性的?
那个共同基类在最终派生类中只有一个副本,地址转换就像单继承一样。这里的实现估计是需要额外的指针以指定虚基类子对象的位置。所以虚基类是有性能开销的。基类的成员函数在派生类中不占存储,成员函数只有一个副本。实际上对于普通继承来说,组合和继承是差不多的。所以有人就建议优先使用组合。

虚函数和虚基类的区别是什么啊?
虚函数 , 虚基类,它们都和virtual有关,这两个带有虚字的定义容易使人混淆,下面先从作用上来解释这两个定义的区别:1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。2、.虚基类是用来在多继承中,如果父类继承自同一个父类,就只实例化一个父类(说的有点...

C++考题中提到纯虚拟函数是什么概念?起什么作用?
通过纯虚拟函数的方式,可以指明一个虚拟函数只是提供了一个可被子类型改写的接口。纯虚函数是在基类中声明的虚函数,它可以在基类中有定义,而且派生类必须定义自己的实现方法。基类不能生成对象,可以使用指针或者引用派生类对象。基类不在基类中实现纯虚函数的方法是在函数原型后加“=0”virtual void ...

什么是虚基类(在C++中)?
这会导致在C类中,B类实际上被两次实例化,从而可能导致问题。通过将B设置为虚基类,可以解决这个问题:class B{};class D1 : virtual public B{};class D2 : virtual public B{};class C: public D1, public D2{}; 这样,C类只从B类继承一次,避免了重复和混乱,提高了代码的清晰性和...

虚基类的问题
什么叫虚基类?我看成了抽像类了。如果是抽像类的话,因为抽像类不允许被实例化,所以就算是允许的话,你写了带参数的构造函数也是没有意义的。

java含有main函数的类的构造方法执行的疑问?
答:因为你没有构造该类的实例。只有在构造类的实例时才会请求类的构造方法。2、包含main函数的类可否被实例化?答:可以。类可否被实例化跟类的内容无关,只需要参考该类的定义,只有虚基类不可被实例化(当然没有访问权限的更不可能)。3、开始做了总结性的阐述,上面两个问题的解答也都附带了简要...

相似回答