Microsoft's help for virtual functions

Source: Internet
Author: User
C ++ Language Reference
Virtual Functions
See Also
Collapse AllExpand AllLanguage Filter: AllLanguage Filter: MultipleLanguage Filter: Visual BasicLanguage Filter: C #Language Filter: C ++Language Filter: J #Language Filter: JScript
Visual Basic (Declaration)
Visual Basic (Usage)
C #
C ++
J #
JScript

A virtual function is a member function that you need CT to be redefined in derived classes. when you refer to a derived class object using a pointer or a reference to the base class, you can call a virtual function for that object and execute the derived class's version of the function.

Virtual functions ensure that the correct function is called for an object, regardless of the expression used to make the function call.

Suppose a base class contains a function declared as virtual and a derived class defines the same function. the function from the derived class is invoked for objects of the derived class, even if it is called using a pointer or reference to the base class. the following example shows a base class that provides an implementation ofPrintBalanceFunction and two Derived classes

  Copy Code
// deriv_VirtualFunctions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

class Account {
public:
Account( double d ) { _balance = d; }
virtual double GetBalance() { return _balance; }
virtual void PrintBalance() { cerr << "Error. Balance not available for base type." << endl; }
private:
double _balance;
};

class CheckingAccount : public Account {
public:
CheckingAccount(double d) : Account(d) {}
void PrintBalance() { cout << "Checking account balance: " << GetBalance() << endl; }
};

class SavingsAccount : public Account {
public:
SavingsAccount(double d) : Account(d) {}
void PrintBalance() { cout << "Savings account balance: " << GetBalance(); }
};

int main() {
// Create objects of type CheckingAccount and SavingsAccount.
CheckingAccount *pChecking = new CheckingAccount( 100.00 ) ;
SavingsAccount *pSavings = new SavingsAccount( 1000.00 );

// Call PrintBalance using a pointer to Account.
Account *pAccount = pChecking;
pAccount->PrintBalance();

// Call PrintBalance using a pointer to Account.
pAccount = pSavings;
pAccount->PrintBalance();
}

In the preceding code, the calltoPrintBalanceAre identical, except t for the objectpAccountPoints to. BecausePrintBalanceIs virtual, the version of the function defined for each object is called.PrintBalanceFunction in the derived classesCheckingAccountAndSavingsAccount"Override" the function in the base classAccount.

If a class is declared that does not provide an overriding Implementation ofPrintBalanceFunction, the default implementation from the base classAccountIs used.

Functions in Derived classes override virtual functions in base classes only if their type is the same. A function in a derived class cannot differ from a virtual function in a base class in its return type only; the argument list must differ as well.

When calling a function using pointers or references, the following rules apply:

  • A call to a virtual function is resolved according to the underlying type of object for which it is called.

  • A call to a nonvirtual function is resolved according to the type of the pointer or reference.

The following example shows how virtual and nonvirtual functions behave when called through pointers:

  Copy Code
// deriv_VirtualFunctions2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

class Base {
public:
virtual void NameOf(); // Virtual function.
void InvokingClass(); // Nonvirtual function.
};

// Implement the two functions.
void Base::NameOf() {
cout << "Base::NameOf/n";
}

void Base::InvokingClass() {
cout << "Invoked by Base/n";
}

class Derived : public Base {
public:
void NameOf(); // Virtual function.
void InvokingClass(); // Nonvirtual function.
};

// Implement the two functions.
void Derived::NameOf() {
cout << "Derived::NameOf/n";
}

void Derived::InvokingClass() {
cout << "Invoked by Derived/n";
}

int main() {
// Declare an object of type Derived.
Derived aDerived;

// Declare two pointers, one of type Derived * and the other
// of type Base *, and initialize them to point to aDerived.
Derived *pDerived = &aDerived;
Base *pBase = &aDerived;

// Call the functions.
pBase->NameOf(); // Call virtual function.
pBase->InvokingClass(); // Call nonvirtual function.
pDerived->NameOf(); // Call virtual function.
pDerived->InvokingClass(); // Call nonvirtual function.
}

Output

 
Derived::NameOf
Invoked by Base
Derived::NameOf
Invoked by Derived

Note that regardless of whetherNameOfFunction is invoked through a pointerBaseOr a pointerDerived, It callthe functionDerived. It callthe functionDerivedBecauseNameOfIs a virtual function, and bothpBaseAndpDerivedPoint to an object of TypeDerived.

Because Virtual functions are called only for objects of class types, you cannot declare global or static functionsVirtual.

TheVirtualKeyword can be used when declaring overriding funding in a derived class, but it is unnecessary; overrides of virtual functions are always virtual.

Virtual functions in a base class must be defined unless they are declared usingPure-specifier. (For more information about pure virtual functions, see Abstract Classes .)

The virtual function-call mechanic can be suppressed by explicitly qualifying the function name using the scope-resolution operator (::). Consider the earlier example involvingAccountClass. To callPrintBalanceIn the base class, use code such as the following:

 
CheckingAccount *pChecking = new CheckingAccount( 100.00 );

pChecking->Account::PrintBalance(); // Explicit qualification.

Account *pAccount = pChecking; // Call Account::PrintBalance

pAccount->Account::PrintBalance(); // Explicit qualification.

Both calltoPrintBalanceIn the preceding example suppress the virtual function-call mechanic.

See AlsoReference

Access to Virtual Functions

To make a suggestion or report a bug about Help or another feature of this product, go to the feedback site.

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.