青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
from http://en.wikipedia.org/wiki/Virtual_function

Virtual function

From Wikipedia, the free encyclopedia

Jump to: navigation, search

In object-oriented programming, a virtual function or virtual method is one whose behavior can be overridden within an inheriting class by a function with the same signature. This concept is a very important part of the polymorphism portion of object-oriented programming (OOP).

Contents

[hide]

[edit] Purpose

The concept of the virtual function solves the following problem:

In OOP when a derived class inherits from a base class, an object of the derived class may be referred to (or cast) as either being the base class type or the derived class type. If there are base class functions overridden by the derived class, a problem then arises when a derived object has been cast as the base class type. When a derived object is referred to as being of the base's type, the desired function call behavior is ambiguous.

The distinction between virtual and not virtual resolves this ambiguity. If the function in question is designated "virtual" in the base class then the derived class's function would be called (if it exists). If it is not virtual, the base class's function would be called.

Virtual functions overcome the problems with the type-field solution by allowing the programmer to declare functions in a base class that can be redefined in each derived class.

[edit] Example

For example, a base class Animal could have a virtual function eat. Subclass Fish would implement eat() differently than subclass Wolf, but you can invoke eat() on any class instance referred to as Animal, and get the eat() behavior of the specific subclass.

This allows a programmer to process a list of objects of class Animal, telling each in turn to eat (by calling eat()), with no knowledge of what kind of animal may be in the list. You also do not need to have knowledge of how each animal eats, or what the complete set of possible animal types might be.

[edit] C++

The following is an example in C++. Note that this example is not exception-safe. In particular, it may leak resources if new or vector::push_back throws an exception.

#include <iostream>
#include <vector>

using namespace std;
class Animal
{
public:
virtual void eat() const { cout << "I eat like a generic Animal." << endl; }
virtual ~Animal() {}
};

class Wolf : public Animal
{
public:
void eat() const { cout << "I eat like a wolf!" << endl; }
};

class Fish : public Animal
{
public:
void eat() const { cout << "I eat like a fish!" << endl; }
};

class GoldFish : public Fish
{
public:
void eat() const { cout << "I eat like a goldfish!" << endl; }
};


class OtherAnimal : public Animal
{
};

int main()
{
std::vector<Animal*> animals;
animals.push_back( new Animal() );
animals.push_back( new Wolf() );
animals.push_back( new Fish() );
animals.push_back( new GoldFish() );
animals.push_back( new OtherAnimal() );

for( std::vector<Animal*>::const_iterator it = animals.begin();
it != animals.end(); ++it)
{
(*it)->eat();
delete *it;
}

return 0;
}

Output with the virtual function Animal::eat():

I eat like a generic Animal.
I eat like a wolf!
I eat like a fish!
I eat like a goldfish!
I eat like a generic Animal.

Output if Animal::eat() were not declared as virtual:

I eat like a generic Animal.
I eat like a generic Animal.
I eat like a generic Animal.
I eat like a generic Animal.
I eat like a generic Animal.

[edit] Java

In Java, all methods are by default "virtual functions." Only methods marked with the keyword final are non-virtual. The following is an example of virtual methods in Java:

import java.util.*;

public class Animal {
public void eat() { System.out.println("I eat like a generic Animal."); }

public static void main(String[] args) {
List<Animal> animals = new LinkedList<Animal>();

animals.add(new Animal());
animals.add(new Wolf());
animals.add(new Fish());
animals.add(new OtherAnimal());

for (Animal currentAnimal : animals) {
currentAnimal.eat();
}
}
}

public class Wolf extends Animal {
public void eat() { System.out.println("I eat like a wolf!"); }
}

public class Fish extends Animal {
public void eat() { System.out.println("I eat like a fish!"); }
}

public class OtherAnimal extends Animal {}

Output:

I eat like a generic Animal.
I eat like a wolf!
I eat like a fish!
I eat like a generic Animal.

[edit] C#

In C#, a base class must provide the virtual modifier for any virtual method, and derived classes must provide the override modifier for any overriden method inherited from a base class. The following is an example in C#:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
public class Animal
{
public virtual void eat()
{
Console.WriteLine("I eat like a generic Animal.");
}
}

public class Wolf : Animal
{
public override void eat()
{
Console.WriteLine("I eat like a wolf!");
}
}

public class Fish : Animal
{
public override void eat()
{
Console.WriteLine("I eat like a fish!");
}
}

public class GoldFish : Fish
{
public override void eat()
{
Console.WriteLine("I eat like a goldfish!");
}
}

public class OtherAnimal : Animal
{
// eat() method is not overridden, so the base class method will be used.
}

class Program
{
static void Main(string[] args)
{
List<Animal> animals = new List<Animal>();

animals.Add(new Animal());
animals.Add(new Wolf());
animals.Add(new Fish());
animals.Add(new GoldFish());
animals.Add(new OtherAnimal());

foreach (Animal currentAnimal in animals)
{
currentAnimal.eat();
}
}
}
}

Output:

I eat like a generic Animal.
I eat like a wolf!
I eat like a fish!
I eat like a goldfish!
I eat like a generic Animal.

[edit] VB.NET

In VB.NET, a base class must provide the Overridable modifier for any virtual method, and derived classes may provide the optional Overrides modifier for any overriden method inherited from a base class (this prevents a warning from being issued). The following is an example in VB.NET:

Imports System
Imports System.Collections.Generic

Namespace ConsoleApplication1

Public Class Animal
Public Overridable Sub eat()
Console.WriteLine("I eat like a generic Animal.")
End Sub
End Class

Public Class Wolf
Inherits Animal
Public Overrides Sub eat()
Console.WriteLine("I eat like a wolf!")
End Sub
End Class

Public Class Fish
Inherits Animal
Public Overrides Sub eat()
Console.WriteLine("I eat like a fish!")
End Sub
End Class

Public Class Goldfish
Inherits Fish
Public Overrides Sub eat()
Console.WriteLine("I eat like a goldfish!")
End Sub
End Class

Public Class OtherAnimal
Inherits Animal
'eat() method is not overridden, so the base class method will be used.
End Class

Public Class Program
Shared Sub Main()
Dim animals As New List(Of Animal)
animals.Add(New Animal())
animals.Add(New Wolf())
animals.Add(New Fish())
animals.Add(New Goldfish())
animals.Add(New OtherAnimal())

For Each currentAnimal As Animal In animals
currentAnimal.eat()
Next
End Sub
End Class

End Namespace

Output:

I eat like a generic Animal.
I eat like a wolf!
I eat like a fish!
I eat like a goldfish!
I eat like a generic Animal.


[edit] Abstract classes and pure virtual functions

A pure virtual function or pure virtual method is a virtual function that is required to be implemented by a derived class that is not abstract. Classes containing pure virtual methods are termed "abstract;" they cannot be instantiated directly, and a subclass of an abstract class can only be instantiated directly if all inherited pure virtual methods have been implemented by that class or a parent class. Pure virtual methods typically have a declaration (signature) and no definition (implementation).

As an example, an abstract base class "MathSymbol" may provide a pure virtual function doOperation(), and derived classes "Plus" and "Minus" implement doOperation() to provide concrete implementations. Implementing doOperation() would not make sense in the "MathSymbol" class as "MathSymbol" is an abstract concept whose behaviour is defined solely for each given kind (subclass) of "MathSymbol". Similarly, a given subclass of "MathSymbol" would not be complete without an implementation of doOperation().

Although pure virtual methods typically have no implementation in the class that declares them, pure virtual methods in C++ are permitted to contain an implementation in their declaring class, providing fallback or default behaviour that a derived class can delegate to if appropriate.

Pure virtual functions are also used where the method declarations are being used to define an interface for which derived classes will supply all implementations. An abstract class serving as an interface contains only pure virtual functions, and no data members or ordinary methods. Use of purely abstract classes as interfaces works in C++ as it supports multiple inheritance. Because many OO languages do not support multiple inheritance they often provide a separate interface mechanism. This is seen in Java for example.

[edit] C++

In C++, pure virtual functions are declared using a special syntax [ = 0 ] as demonstrated below.

class Abstract {
public:
virtual void pure_virtual() = 0;
};

The pure virtual function declaration provides only the prototype of the method. Although an implementation of the pure virtual function is typically not provided in an abstract class, it may be included, although the definition may not be included at the point of declaration [1]. Every non-abstract child class is still required to override the method, but the implementation provided by the abstract class may be called in this way:

 void Abstract::pure_virtual() {
// do something
}

class Child : public Abstract {
virtual void pure_virtual(); // no longer abstract, this class may be
// instantiated.
};

void Child::pure_virtual() {
Abstract::pure_virtual(); // the implementation in the abstract class
// is executed
}

[edit] Java (and C#)

In Java (and C#), pure virtual methods are declared using the abstract keyword. Such a method cannot have a body. A class containing abstract methods (either directly, or inherited and not overridden) must itself be declared abstract. (But the converse is not true - an abstract class is not required to have any abstract methods.) An abstract class cannot be instantiated.

abstract class B {
abstract void a_pure_virtual_function();
}

Java also uses interfaces. All of the methods declared in an interface are implicitly abstract:

interface C {
void a_pure_virtual_function();
}

[edit] Behavior During Construction and Destruction

Languages differ in their behaviour while the constructor or destructor of an object is running. For some languages, notably C++, the virtual dispatching mechanism has different semantics during construction and destruction of an object. While it is recommended that virtual function calls in constructors should be avoided for C++ [2], in some other languages, for example Java and C#, the derived implementation can be called during construction and design patterns such as the Abstract Factory Pattern actively promote this usage in languages supporting the ability.

[edit] C++

#include <iostream>
#include <string>

using namespace std;

struct A
{
virtual string name() const { return "A"; }
virtual ~A() { cout << "Destructing " << name(); }
};

struct B : A
{
B() { cout << "Constructing " << name() << endl; }
virtual string name() const { return "B"; }
};

struct C : B
{
virtual string name() const { return "C"; }
};

int main()
{
C c; // Output: "Constructing B"

} // Output: "Destructing A"

[edit] Java

public class Base {
public int length() { return 0; }
public Base()
{
System.out.println("Constructing " + length());
}

static class Derived extends Base {
String name_;
public Derived(String name)
{
name_ = name != null ? name : ""; // Class invariant name_ is not null
}
public int length() { return name_.length(); } // Assume name_ is not null
}

public static void main(String[] args)
{
new Derived("Ooops"); // NullPointerException, Derived.name_ has not been assigned to yet
}
}

This is because the constructor of Base is executed before the constructor of Derived. As the constructor of Base calls length(), a null pointer exception is thrown.

[edit] Virtual destructors

Object-oriented languages typically manage memory allocation and deallocation automatically when objects are created and destroyed, however some object-oriented languages allow a custom destructor method to be implemented if desired. One such language is C++, and as illustrated in the following example, it is important for a C++ base class to have a virtual destructor to ensure that the destructor from the most derived class will always be called.

In the example below having no virtual destructor, while deleting an instance of class B will correctly call destructors for both B and A if the object is deleted as an instance of B, an instance of B deleted via a pointer to its base class A will produce undefined behaviour.[3] On many implementations, the destructor for B will not be called in this situation.

 #include <iostream>
using namespace std;

class A
{
public:

A() { }
~A() { cout << "Destroy A" << endl; }
};

class B : public A
{
public:

B() { }
~B() { cout << "Destroy B" << endl; }
};

int main()
{
A* b1 = new B;
B* b2 = new B;

delete b1; // According to the C++ standard,
// the behaviour of this is undefined.
// Usually, only ~A() is called though b1 is an instance
// of class B because ~A() is not declared virtual.
delete b2; // Calls destructors ~B() and ~A()

return 0;
}

Possible output:

Destroy A
Destroy B
Destroy A

Correctly declaring the destructor for class A as virtual ~A() will ensure that the destructor for class B is called in both cases with the example above.

[edit] See also

[edit] References

  1. ^ Standard C++ 98 - 10.4/2
  2. ^ Meyers, Scott (June 6, 2005). "Never Call Virtual Functions during Construction or Destruction". http://www.artima.com/cppsource/nevercall.html. 
  3. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.3.5 Delete [expr.delete] para. 3


posted on 2009-04-19 23:32 chatler 閱讀(873) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品99| 亚洲国产天堂久久综合网| 国产一区二区三区最好精华液| 欧美日韩视频在线| 欧美精品一区二区三区一线天视频| 久色成人在线| 欧美精品乱码久久久久久按摩| 欧美激情一区在线观看| 欧美日韩卡一卡二| 国产精品视频第一区| 国产精品另类一区| 国产一区二区中文字幕免费看| 国产一区二区三区在线观看视频| 激情一区二区三区| 亚洲精品乱码久久久久久| 亚洲国产婷婷香蕉久久久久久| 亚洲精品少妇30p| 亚洲欧美日韩第一区| 久久免费观看视频| 亚洲破处大片| 欧美亚洲系列| 免费观看一级特黄欧美大片| 欧美调教视频| 亚洲电影欧美电影有声小说| 一本久久a久久免费精品不卡| 欧美国产一区二区三区激情无套| 欧美激情一区二区三区高清视频| 国产精品欧美一区喷水| 在线观看日韩av电影| 亚洲在线视频免费观看| 裸体女人亚洲精品一区| 亚洲视频你懂的| 美女视频网站黄色亚洲| 国产欧美欧美| 夜夜嗨av一区二区三区免费区| 榴莲视频成人在线观看| 国产精品久久久久9999高清| 在线国产日韩| 久久国产精品久久久久久电车 | 欧美人妖在线观看| 国产亚洲精品高潮| 亚洲综合视频在线| 亚洲人午夜精品| 久久一二三区| 国内精品国产成人| 亚洲欧美一区二区三区久久 | 久久久久国产成人精品亚洲午夜| 欧美区亚洲区| 亚洲精品永久免费| 欧美激情中文字幕一区二区| 久久国产精品久久久久久| 国产精品你懂的在线欣赏| 亚洲美女福利视频网站| 亚洲第一区在线观看| 久久久www成人免费精品| 国产日韩欧美在线看| 欧美影院午夜播放| 在线午夜精品| 国产精品chinese| 一区二区三区色| 亚洲乱亚洲高清| 欧美日韩1234| 亚洲一区二区三区中文字幕| 一区二区三区欧美成人| 欧美日韩免费在线视频| 亚洲一区成人| 亚洲女爱视频在线| 国产欧美一区视频| 久久精品人人做人人爽| 欧美一区深夜视频| 永久免费视频成人| 亚洲国产成人tv| 欧美国产激情| 亚洲一区二区四区| 欧美一区二区三区精品| 在线成人av网站| 亚洲第一福利在线观看| 欧美激情黄色片| 亚洲一区二区三区四区五区黄| 亚洲欧美国产视频| 在线观看国产精品网站| 久久成人18免费网站| 欧美一区二区视频免费观看| 国产一区二区三区四区在线观看| 久久久久久久999精品视频| 亚洲欧美中文日韩v在线观看| 亚洲黄色成人久久久| 欧美成人免费全部观看天天性色| 亚洲理论在线观看| 亚洲视频高清| 狠狠色2019综合网| 亚洲精品视频二区| 国产精品一二三四| 免费永久网站黄欧美| 欧美日韩一区在线播放| 欧美一区二区三区喷汁尤物| 狼人天天伊人久久| 亚洲午夜激情网页| 久久精品首页| 亚洲色无码播放| 久久久久国产精品人| 亚洲一区二区四区| 蜜桃av一区| 久久九九全国免费精品观看| 欧美日韩p片| 另类亚洲自拍| 国产久一道中文一区| 亚洲国产视频一区二区| 国产视频欧美视频| 亚洲精品中文字幕女同| 国产一区在线播放| 99在线视频精品| 亚洲精品美女久久久久| 性做久久久久久| 亚洲欧美乱综合| 欧美精品一区三区| 榴莲视频成人在线观看| 国产女主播一区二区三区| 亚洲精品视频啊美女在线直播| 亚洲成人原创| 久久久久久久综合色一本| 亚洲在线观看免费视频| 欧美区日韩区| 亚洲激情综合| 亚洲国产日韩欧美在线动漫| 久久国产福利国产秒拍| 久久精品国产欧美亚洲人人爽| 国产精品乱看| 亚洲欧美文学| 久久福利毛片| 国产一区高清视频| 欧美制服丝袜第一页| 久久精品亚洲一区二区三区浴池| 国产精品美女久久久浪潮软件| 在线午夜精品自拍| 午夜精品一区二区三区在线视| 国产精品高清网站| 99综合视频| 亚洲男人第一网站| 国产精品久久久久久久app| 亚洲一区二区三区视频播放| 亚洲尤物在线| 国产乱码精品一区二区三区av| 亚洲欧美在线视频观看| 性色av一区二区三区| 国产欧美日韩综合精品二区| 亚洲影院在线观看| 久久久免费精品视频| 亚洲国产成人av| 欧美极品aⅴ影院| 亚洲国产精品福利| 亚洲欧洲一区二区天堂久久| 麻豆视频一区二区| 欧美激情a∨在线视频播放| 亚洲第一区在线观看| 欧美.www| 99国产精品私拍| 欧美一级久久| 一区二区三区亚洲| 欧美大片免费久久精品三p | 影音先锋在线一区| 另类国产ts人妖高潮视频| 最新国产乱人伦偷精品免费网站| 日韩视频在线一区二区| 国产精品久久久久久久电影| 欧美一区二区三区视频免费| 开心色5月久久精品| 夜夜嗨av色一区二区不卡| 国产女主播一区| 欧美福利精品| 午夜精品视频在线| 米奇777在线欧美播放| 一区二区久久| 国产在线乱码一区二区三区| 欧美顶级少妇做爰| 亚洲男人av电影| 欧美黄色视屏| 性欧美xxxx视频在线观看| 亚洲国产成人久久综合| 国产精品免费观看在线| 久久综合一区| 亚洲一二三级电影| 欧美国产日韩精品| 亚洲欧美日韩在线高清直播| 亚洲国产成人不卡| 国产日韩av在线播放| 欧美成人免费全部观看天天性色| 亚洲男人的天堂在线| 91久久国产自产拍夜夜嗨| 久久精品视频一| 亚洲神马久久| 最新日韩在线| 在线观看欧美亚洲| 国产乱码精品一区二区三| 欧美日产国产成人免费图片| 老司机一区二区三区| 久久久精品动漫| 亚洲欧美视频在线观看视频| 一个人看的www久久| 1000部国产精品成人观看|