About: Virtual inheritance     Goto   Sponge   NotDistinct   Permalink

An Entity of Type : dbo:TopicalConcept, within Data Space : dbpedia.org:8891 associated with source document(s)
QRcode icon
http://dbpedia.org:8891/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FVirtual_inheritance

Virtual inheritance is a C++ technique that ensures only one copy of a base class's member variables are inherited by grandchild derived classes. Without virtual inheritance, if two classes B and C inherit from a class A, and a class D inherits from both B and C, then D will contain two copies of A's member variables: one via B, and one via C. These will be accessible independently, using scope resolution. Instead, if classes B and C inherit virtually from class A, then objects of class D will contain only one set of the member variables from class A. Consider the following class hierarchy.

AttributesValues
rdf:type
rdfs:label
  • Herencia virtual (es)
  • 仮想継承 (ja)
  • Virtual inheritance (en)
  • Виртуальное наследование (ru)
  • Віртуальне успадкування (uk)
  • 虚继承 (zh)
rdfs:comment
  • En C++, herencia virtual es un tipo de herencia que solventa algunos de los problemas causados por la herencia múltiple (particularmente, el "problema del diamante") mediante la aclaración de la ambigüedad sobre qué miembros de clases padre usar. Es usada cuando la herencia está representando restricciones de un conjunto más que la composición de partes. Una clase base multi-heredada se denota como virtual con la palabra clave virtual. (es)
  • 仮想継承(かそうけいしょう、英: Virtual inheritance)とは、C++プログラミング言語における継承の一種で、多重継承によって生じる問題(菱形継承問題)を解決するもの。どの上位クラスのメンバーを使うか曖昧さが生じる部分で、明確化する。仮想継承は、部分の合成という意味での継承よりも、継承が上位クラスへの制限を表している場合に使われる。多重継承の基底クラスは、virtual というキーワードで仮想継承であることを指定される。 (ja)
  • Виртуа́льное насле́дование (англ. virtual inheritance) в языке программирования C++ — один из вариантов наследования, который нужен для решения некоторых проблем, порождаемых наличием возможности множественного наследования (особенно «ромбовидного наследования»), путём разрешения неоднозначности того, методы которого из суперклассов (непосредственных классов-предков) необходимо использовать. Оно применяется в тех случаях, когда множественное наследование вместо предполагаемой полной композиции свойств классов-предков приводит к ограничению доступных наследуемых свойств вследствие неоднозначности. Базовый класс, наследуемый множественно, определяется виртуальным с помощью ключевого слова virtual. (ru)
  • 虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。 举例来说:假如类A和类B各自从类X派生(非虚继承且假设类X包含一些数据成员),且类C同时多继承自类A和B,那么C的对象就会拥有两套X的实例数据(可分别独立访问,一般要用适当的消歧义限定符)。但是如果类A与B各自虚继承了类X,那么C的对象就只包含一套类X的实例数据。对于这一概念典型实现的编程语言是C++。 这一特性在多重继承应用中非常有用,可以使得虚基类对于由它直接或间接派生的类来说,拥有一个共同的基类对象实例。避免由于带有歧义的组合而产生的问题(如“菱形继承问题”)。其原理是,间接派生类(C)穿透了其父类(上面例子中的A与B),实质上直接继承了虚基类X。 这一概念一般用于“继承”在表现为一个整体,而非几个部分的组合时。在C++中,基类可以通过使用关键字virtual来声明虚继承关系。 (zh)
  • Virtual inheritance is a C++ technique that ensures only one copy of a base class's member variables are inherited by grandchild derived classes. Without virtual inheritance, if two classes B and C inherit from a class A, and a class D inherits from both B and C, then D will contain two copies of A's member variables: one via B, and one via C. These will be accessible independently, using scope resolution. Instead, if classes B and C inherit virtually from class A, then objects of class D will contain only one set of the member variables from class A. Consider the following class hierarchy. (en)
  • Віртуальне успадкування (англ. virtual inheritance) — в мові програмування C++, це один із варіантів успадкування. Він дозволяє розв'язати деякі проблеми множинного успадкування, зокрема «ромбовидне успадкування».Віртуальне успадкування декларується словом virtual перед іменем базового класу. Якщо при множинному успадкуванні серед базових класів є декілька екземплярів одного класу, що завжди успадковувався віртуально, то в похідному класі буде тільки одна копія даних такого класу. В коді: Виклик bat.eat є неоднозначним, оскільки компілятор не знає кого викликати: (uk)
foaf:depiction
  • http://commons.wikimedia.org/wiki/Special:FilePath/Diamond_inheritance.svg
dcterms:subject
Wikipage page ID
Wikipage revision ID
Link from a Wikipage to another Wikipage
Link from a Wikipage to an external page
sameAs
dbp:wikiPageUsesTemplate
thumbnail
Link from a Wikipa... related subject.
has abstract
  • En C++, herencia virtual es un tipo de herencia que solventa algunos de los problemas causados por la herencia múltiple (particularmente, el "problema del diamante") mediante la aclaración de la ambigüedad sobre qué miembros de clases padre usar. Es usada cuando la herencia está representando restricciones de un conjunto más que la composición de partes. Una clase base multi-heredada se denota como virtual con la palabra clave virtual. (es)
  • Virtual inheritance is a C++ technique that ensures only one copy of a base class's member variables are inherited by grandchild derived classes. Without virtual inheritance, if two classes B and C inherit from a class A, and a class D inherits from both B and C, then D will contain two copies of A's member variables: one via B, and one via C. These will be accessible independently, using scope resolution. Instead, if classes B and C inherit virtually from class A, then objects of class D will contain only one set of the member variables from class A. This feature is most useful for multiple inheritance, as it makes the virtual base a common subobject for the deriving class and all classes that are derived from it. This can be used to avoid the diamond problem by clarifying ambiguity over which ancestor class to use, as from the perspective of the deriving class (D in the example above) the virtual base (A) acts as though it were the direct base class of D, not a class derived indirectly through a base (B or C). It is used when inheritance represents restriction of a set rather than composition of parts. In C++, a base class intended to be common throughout the hierarchy is denoted as virtual with the virtual keyword. Consider the following class hierarchy. struct Animal { virtual ~Animal = default; virtual void Eat {}};struct Mammal: Animal { virtual void Breathe {}};struct WingedAnimal: Animal { virtual void Flap {}};// A bat is a winged mammalstruct Bat: Mammal, WingedAnimal {};Bat bat; As declared above, a call to bat.Eat is ambiguous because there are two Animal (indirect) base classes in Bat, so any Bat object has two different Animal base class subobjects. So an attempt to directly bind a reference to the Animal subobject of a Bat object would fail, since the binding is inherently ambiguous: Bat b;Animal& a = b; // error: which Animal subobject should a Bat cast into, // a Mammal::Animal or a WingedAnimal::Animal? To disambiguate, one would have to explicitly convert bat to either base class subobject: Bat b;Animal& mammal = static_cast<Mammal&>(b); Animal& winged = static_cast<WingedAnimal&>(b); In order to call Eat, the same disambiguation, or explicit qualification is needed: static_cast<mammal&> (bat).Eat </mammal&> or static_cast<wingedanimal&> (bat).Eat </wingedanimal&> or alternatively bat.Mammal::Eat and bat.WingedAnimal::Eat. Explicit qualification not only uses an easier, uniform syntax for both pointers and objects but also allows for static dispatch, so it would arguably be the preferable method. In this case, the double inheritance of Animal is probably unwanted, as we want to model that the relation (Bat is an Animal) exists only once; that a Bat is a Mammal and is a WingedAnimal does not imply that it is an Animal twice: an Animal base class corresponds to a contract that Bat implements (the "is a" relationship above really means "implements the requirements of"), and a Bat only implements the Animal contract once. The real world meaning of "is a only once" is that Bat should have only one way of implementing Eat, not two different ways, depending on whether the Mammal view of the Bat is eating, or the WingedAnimal view of the Bat. (In the first code example we see that Eat is not overridden in either Mammal or WingedAnimal, so the two Animal subobjects will actually behave the same, but this is just a degenerate case, and that does not make a difference from the C++ point of view.) This situation is sometimes referred to as diamond inheritance (see Diamond problem) because the inheritance diagram is in the shape of a diamond. Virtual inheritance can help to solve this problem. (en)
  • 仮想継承(かそうけいしょう、英: Virtual inheritance)とは、C++プログラミング言語における継承の一種で、多重継承によって生じる問題(菱形継承問題)を解決するもの。どの上位クラスのメンバーを使うか曖昧さが生じる部分で、明確化する。仮想継承は、部分の合成という意味での継承よりも、継承が上位クラスへの制限を表している場合に使われる。多重継承の基底クラスは、virtual というキーワードで仮想継承であることを指定される。 (ja)
  • Виртуа́льное насле́дование (англ. virtual inheritance) в языке программирования C++ — один из вариантов наследования, который нужен для решения некоторых проблем, порождаемых наличием возможности множественного наследования (особенно «ромбовидного наследования»), путём разрешения неоднозначности того, методы которого из суперклассов (непосредственных классов-предков) необходимо использовать. Оно применяется в тех случаях, когда множественное наследование вместо предполагаемой полной композиции свойств классов-предков приводит к ограничению доступных наследуемых свойств вследствие неоднозначности. Базовый класс, наследуемый множественно, определяется виртуальным с помощью ключевого слова virtual. (ru)
  • Віртуальне успадкування (англ. virtual inheritance) — в мові програмування C++, це один із варіантів успадкування. Він дозволяє розв'язати деякі проблеми множинного успадкування, зокрема «ромбовидне успадкування».Віртуальне успадкування декларується словом virtual перед іменем базового класу. Якщо при множинному успадкуванні серед базових класів є декілька екземплярів одного класу, що завжди успадковувався віртуально, то в похідному класі буде тільки одна копія даних такого класу. В коді: class Animal { public: virtual void eat;};class Mammal : public Animal { public: virtual void breathe;};class WingedAnimal : public Animal { public: virtual void flap;};// A bat is a winged mammalclass Bat : public Mammal, public WingedAnimal {};Bat bat; Виклик bat.eat є неоднозначним, оскільки компілятор не знає кого викликати: * Mammal::Animal::eat чи * WingedAnimal::Animal::eat. Насправді, це дві незалежні функії, кожну з яких можна викликати перетворюючи тип Bat до першого чи другого свого беспосереднього базового класу. Також подібна неоднозначність буде при приведенні типу Bat до типу Animal, оскільки в кожному об'єкті Bat міститься два об'єкта Animal (по одному у Mammal та WingedAnimal). Щоб уникнути такої незручної надлишковості, віртуальне успадкування зберігає тільки одну копію даних об'єкта Animal в об'єкті Bat, якщо Animal кожен раз був успадкований віртуально. (uk)
  • 虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。 举例来说:假如类A和类B各自从类X派生(非虚继承且假设类X包含一些数据成员),且类C同时多继承自类A和B,那么C的对象就会拥有两套X的实例数据(可分别独立访问,一般要用适当的消歧义限定符)。但是如果类A与B各自虚继承了类X,那么C的对象就只包含一套类X的实例数据。对于这一概念典型实现的编程语言是C++。 这一特性在多重继承应用中非常有用,可以使得虚基类对于由它直接或间接派生的类来说,拥有一个共同的基类对象实例。避免由于带有歧义的组合而产生的问题(如“菱形继承问题”)。其原理是,间接派生类(C)穿透了其父类(上面例子中的A与B),实质上直接继承了虚基类X。 这一概念一般用于“继承”在表现为一个整体,而非几个部分的组合时。在C++中,基类可以通过使用关键字virtual来声明虚继承关系。 (zh)
gold:hypernym
prov:wasDerivedFrom
page length (characters) of wiki page
foaf:isPrimaryTopicOf
is Link from a Wikipage to another Wikipage of
is Wikipage redirect of
is foaf:primaryTopic of
Faceted Search & Find service v1.17_git139 as of Feb 29 2024


Alternative Linked Data Documents: ODE     Content Formats:   [cxml] [csv]     RDF   [text] [turtle] [ld+json] [rdf+json] [rdf+xml]     ODATA   [atom+xml] [odata+json]     Microdata   [microdata+json] [html]    About   
This material is Open Knowledge   W3C Semantic Web Technology [RDF Data] Valid XHTML + RDFa
OpenLink Virtuoso version 08.03.3332 as of Dec 5 2024, on Linux (x86_64-generic-linux-glibc212), Single-Server Edition (62 GB total memory, 43 GB memory in use)
Data on this page belongs to its respective rights holders.
Virtuoso Faceted Browser Copyright © 2009-2024 OpenLink Software