Functions of C ++ virtual classes)

Source: Internet
Author: User
ArticleDirectory
    • Role of the virtual base class
Role of the virtual base class
When a base class is declared as a virtual base class, even if it becomes a public base class on multiple inheritance links, the final derived class only has one backup of it. For example:
Class cbase {};
Class cderive1: virtual public cbase {};
Class cderive2: virtual public cbase {};
Class cderive12: Public cderive1, cderive2 {};
Only one object data class cbase is available in the cderive12 object. Features of the virtual base class:
The parameters of the virtual base class constructor must be initialized by the newly derived class (even if it is not directly inherited );
The constructor of the virtual base class is executed before the constructor of the non-virtual base class.
Rewrite "C ++ learning notes (9) -- use the range operator to solve the ambiguity in inheritance"Program, Observe the role of the virtual base class CodeAs follows: /**/ /***************************************** *******************************
* Hybrid inheritance: Multi-base class inheritance and multi-Inheritance
**************************************** ********************************/
# Include <Iostream. h>
//Base Class
Class Cbase
... {
Protected :
Int A;
Public :
Cbase (Int Na)
... {
A=NA;
Cout<"Cbase constructor!";
}

~Cbase ()...{Cout<"Cbase deconstructor!";}
} ;

//Derived class 1 (declare cbase as a virtual base class)
ClassCderive1:Virtual Public Cbase
... {
Public :
Cderive1 (Int Na): cbase (NA)
... {
Cout<"Cderive1 constructor!";
}

~Cderive1 ()...{Cout<"Cderive1 deconstructor!";}

IntGeta ()...{ReturnA ;}
} ;

//Derived class 2 (declare cbase as a virtual base class)
ClassCderive2:Virtual Public Cbase
... {
Public :
Cderive2 (Int Na): cbase (NA)
... {
Cout<"Cderive2 constructor!";
}
~Cderive2 ()...{Cout<"Cderive2 deconstructor!";}
IntGeta ()...{ReturnA ;}
} ;

//Child-derived class
ClassCderive12:PublicCderive1,Public Cderive2
... {< br> Public >:
cderive12 ( int Na1, int Na2, int na3): cderive1 (Na1), cderive2 (Na2), cbase (na3)
... {< br> cout " cderive12 constructor! " ;
}
~ cderive12 () ... {cout " cderive12 deconstructor! " ;}
} ;
Void Main ()
... {< br> cderive12 OBJ ( 100 , 200 , 300 );
// obtain the value inherited from cderive1
cout " from cderive1: A = " obj. cderive1: geta ();
// obtain the value inherited from cderive2
cout " from cderive2: A = " obj. cderive2: geta () Endl;
} 1. Value of the Child-derived class object: As shown in the preceding example, the indirect base class cbase constructor is called in the constructor initialization table of the cderived12 class, which is invalid for non-virtual base classes, however, the virtual base class is valid and necessary.
For the derived classes cderived1 and cderived2, whether they are internal implementations or instantiated objects, whether the base class cbase is their virtual base class is not affected. Affected is that their derived class cderived12, because it can reach cbase from both paths. 2. Running result: it can be seen that the constructor of its public base class only calls once, and takes precedence over the constructor calls of non-base classes, the value of the member variable of the object OBJ of the Child-derived class is only one. Therefore, when the common base class cbase is declared as a virtual base class, although it becomes a public base class of cderive1 and cderive2, however, the child-derived class cderive12 only has one backup. You can carefully compare the running result with that of Example 2.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.