如题所述
如何对C++虚基类构造函数
你应该知道虚基类是为了防止多继承产生问题,比如一个基类可能会被同一个子类继承好几次,有了虚基类,那么这个基类就不会在对象内存布局上重复出现了。然后再看这句话,结合前面的描述,我们可以这样理解。
class A 基类A
class B:public A B继承A
class C:public A,B C继承A,也继承B,此处A应该为虚继承,否则A就会被继承两次,因为B继承A
当创建 C对象 c时:
C c
在虚继承的情况下,为了保证虚基类A只被构造一次,那么我们就这样规定了:
1.在c创建时中会调用A的构造函数初始化和C本身的构造函数初始化。(对应这句话:“
规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化”)
2.B属于c的直接基类,在构造c是当然要构造B,也就是会调用系统提供给B的构造函数或者B自定义的构造函数,但是B不会在这里不会对A初始化了。(这就是你问的地方)
上面只是分成两个部分说明,并不代表构造的准确过程
如何对C++虚基类构造函数求答案
下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的。 前面讲过,为了初始化基类的子对象,派生类的构造函数要调用基类的构造函数。对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。由于继承结构的层次可能很深,规定将在建立对象时所指定的类称为最派生类。C++规定,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的C++虚基类,那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数。而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。C++又规定,在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则C++虚基类的构造函数先于非虚基类的构造函数的执行。下面举一例子说明具有C++虚基类的派生类的构造函数的用法。#include class A { public: A(const char *s) { cout< ~A() {} }; class B : virtual public A { public: B(const char *s1, const char *s2):A(s1) { cout< } }; class C : virtual public A { public: C(const char *s1, const char *s2):A(s1) { cout< } }; class D : public B, public C { public: D(const char *s1, const char *s2, const char *s3, const char *s4) :B(s1, s2), C(s1, s3), A(s1) { cout< } }; void main() { D *ptr = new D("class A", "class B", "class C", "class D"); delete ptr; } 在派生类B和C中使用了C++虚基类,使得建立的D类对象只有一个虚基类子对象。在派生类B,C,D的构造函数的成员初始化列表中都包含了对虚基类A的构造函数。在建立类D对象时。只有C++虚基类D的构造函数的成员初始化列表中列出的虚基类构造函数被调用,并且仅调用一次,而类D基类的构造函数的成员初始化列表中列出的虚基类构造函数不被执行。这一点将从该程序的输出结果可以看出。
有虚基类时 多继承构造函数调用顺序, 如何只执行基类构造函数一次
虚基类的构造函数在任何非虚基类构造函数前调用。如果构造中包括多个虚基类,它们的调用顺序以声明顺序为准。如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用。
下面是一个例子:
class X : public Y, virtual public Z
X one;
调用顺序如下:
Z(); 虚基类初始化
Y(); 非虚基类
X(); 继承类
C++中若某类a从基类b、虚基类c派生而来,且该类中具有对象成员d,则在构造该类的对象时执行构造函数的顺序
构造一个类的对象的一般顺序是:
1.如果该类有直接或间接虚基类,先执行虚基类的构造函数;
2.如果该类有其他基类,按照他们在继承声明列表中出现的顺序分别执行构造函数,但是不再执行它们的虚基类的构造函数。
3.按照在类定义中出现的顺序,对派生类中新增的成员对象进行初始化。
4.执行构造函数函数体。
所以本题构造函数执行顺序为:c,b,d,a;
怎样理解c++中的虚基类和虚函数.纯虚函数
类里的函数通常是静态的,
虚函数就是动态的,意思是后代类(对象)的函数可以有不同的行为。
含有虚函数的类就是虚基类。
假如虚函数是祖先类里仅仅声明,而没实现(没有行为),则这个就是纯虚函数。
C++虚基类
虚基类是相对于它的派生类而言的,它本身可以是一个普通的类。
只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类。比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有虚继承,那类B就只是类A的基类。
虚继承主要用于一个类继承多个类的情况,避免重复继承同一个类两次或多次。
例如 由类A派生类B和类C,类D又同时继承类B和类C,这时候类D就要用虚继承的方式避免重复继承类A两次。
C++中如何使用虚基类
楼上的说法有点小问题,不是一般不用于声明对象而是绝对不能用来声明对象!但却可以声明一个指向虚基类的对象指针.当你要用到多个相对独立的对象而这些对象又有一些共同的特征时,你就可以声明一个虚基类,把多个对象共有的特征作为这个虚基类的公共接口,然后再由它派生出多个对象.在我看来虚基类最巧妙的地方就在于实现了多态,当一个虚基类的指针调用同一个函数时,却可以执行不同的操作.
C++ 为什么构造函数不能是虚函数?
你自己要明白虚函数是什么?(虚函数就是为了对象动态调用函数)我问你一句?构造函数执行之前,都没构造怎么会有对象,那怎么会对象调用构造函数。
c++ 中如何调用基类的虚函数?
通过代码调用基类虚函数。
具体代码如下:
class TrajectoryBuilder {
public:
TrajectoryBuilder() {}
virtual ~TrajectoryBuilder() {}
TrajectoryBuilder(const TrajectoryBuilder&) = delete;
TrajectoryBuilder& operator=(const TrajectoryBuilder&) = delete;
virtual const Submaps* submaps() const = 0
virtual const PoseEstimate& pose_estimate() const = 0;
virtual void AddSensorData(const string& sensor_id,
std::unique_ptr<sensor::Data> data) = 0;
void AddRangefinderData(const string& sensor_id, mon::Time time,
const Eigen::Vector3f& origin,
const sensor::PointCloud& ranges) {
AddSensorData(sensor_id,
mon::make_unique<sensor::Data>(
time, sensor::Data::Rangefinder{origin, ranges}));