-, Printer printDocument. - , vptr.. 4 .
, 4 , vbptr (virtual base class pointer), , ( ) vbptr. , , . , , .
:
Printer , (vptr_1). (vbptr) . 0 - Printer, .. 4 . 1 - PoweredDevice vbptr. m_pagesPerMinute, PoweredDevice. vptr PoweredDevice .
, , Printer, PoweredDevice, :
Printer * p = new Printer(300, 15);
std::cout << p->getNominalPower();
● p vbptr;
● vbptr 2 1 0;
● , PoweredDevice Printer;
● getNominalPower (, , ), this, p + .
, , . , , .
Scanner . Copier, 36 . :
4 (16 ), 3 vptr (12 ) 2 vbptr (8 ). , 36 .
Copier:
|
|
//
Copier::Copier (int _nominalPower, int _scanDPI, int _pagesPerMinute)
// !
: PoweredDevice(_nominalPower)
//
, Scanner(_nominalPower, _scanDPI)
, Printer(_nominalPower, _pagesPerMinute)
{
}
.., Copier, PoweredDevice . , , Scanner Printer, .
. , , . (most derived class) . . , vbptr . . Copier , vbptr :
01378E72 mov eax,dword ptr [ebp-14h]
01378E75 mov dword ptr [eax+4],offset Copier::`vbtable' (139BE8Ch)
01378E7C mov eax,dword ptr [ebp-14h]
01378E7F mov dword ptr [eax+10h],offset Copier::`vbtable' (139BE80h)
01378E86 mov eax,dword ptr [ebp+8]
, Printer ( Scanner ), Copier, :
01388923 mov eax,dword ptr [this]
01388926 mov dword ptr [eax+4],offset Printer::`vbtable' (139D840h)
, . Copier , :
PoweredDevice::PoweredDevice
Printer::Printer
Scanner::Scanner
Copier::Copier
Printer, :
PoweredDevice::PoweredDevice
Printer::Printer
Scanner, :
PoweredDevice::PoweredDevice
Scanner::Scanner
- Printer Scanner PoweredDevice, Copier? , . , . Copier. , , , , 1:
Copier c(500, 300, 15);
|
|
Push 1
Push 0Fh
Push 12Ch
E push 1F4h
01302293 lea ecx,[ebp-34h]
01302296 call Copier::Copier (12E3311h)
, Printer, :
Printer p(300, 15);
E223D push 1
E223F push 0Fh
E2241 push 12Ch
013E2246 lea ecx,[ebp-28h]
013E2249 call Printer::Printer (13C349Ch)
, Copier Printer, 0, Printer :
EC4 push 0
01378EC6 mov eax,dword ptr [ebp+10h]
EC9 push eax
01378ECA mov ecx,dword ptr [ebp+8]
ECD push ecx
01378ECE mov ecx,dword ptr [ebp-14h]
ED1 add ecx,0Ch
01378ED4 call Printer::Printer (137349Ch)
Printer, Scanner Copier , 1 (.., ). Printer:
Printer::Printer (Printer * this,
Int _nominalpower,
Int _pagesPerMinute,
int mostDerived)
{
If (mostDerived)
PoweredDevice::PoweredDevice(this + vbptr[ 0 ] + vbptr[ 1 ], _nominalPower);
this->m_pagesPerMinute = _pagesPerMinute;
}
, Copier :
Copier::Copier (Copier * this,
Int _nominalpower,
Int _pagesPerMinute,
Int _scanDPI,
int mostDerived)
{
If (mostDerived)
PoweredDevice::PoweredDevice(this + offset3, _nominalPower);
Printer::Printer(this + offset1, _nominalPower, _pagesPerMinute, 0);
Scanner::Scanner(this + offset2, _nominalPower, _scanDPI, 0);
}
:
Copier::~Copier
Scanner::~Scanner
Printer::~Printer
PoweredDevice::~PoweredDevice
, GCC - Linux, . vbptr vbtable . , . , , vptr , . , 0, , - . vptr , . , .
Microsoft, . Printer Scanner 1 , Copier - 2 .
39. RTTI - , . std::type_info, typeid .
RTTI ++, . , , dynamic_cast
, , , std::type_info , <typeinfo>. . , :
|
|
● name(), , . , . .
● == !=. type_info . , 1 type_info, type_info , .
● before, std::type_info, bool, . , . -, std::type_info (std::map, std::set).
● , .
typeid:
#include "date.hpp"
#include <iostream>
#include <string>
#include <typeinfo>
Int main ()
{
const std::type_info & intTypeInfo = typeid(int);
std::cout << intTypeInfo.name() << std::endl;
const std::type_info & dateTypeInfo = typeid(Date);
std::cout << dateTypeInfo.name() << std::endl;
const std::type_info & stringTypeInfo = typeid(std::string);
std::cout << stringTypeInfo.name() << std::endl;
}
, typeid :
#include "date.hpp"
#include <iostream>
#include <string>
#include <typeinfo>
int main ()
{
const std::type_info & typeInfo1 = typeid (2 + 5.3);
std::cout << typeInfo1.name() << std::endl;
const std::type_info & typeInfo2 = typeid (Date().GetMonth());
std::cout << typeInfo2.name() << std::endl;
const std::type_info & typeInfo3 = typeid (& std::string::substr);
std::cout << typeInfo3.name() << std::endl;
}
typeid:
● - / ;
● - , .