.


:




:

































 

 

 

 


-, PoweredDevice . vptr. 8




-, 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:

● - / ;

● - , .

 

 





:


: 2016-07-29; !; : 482 |


:

:

.
==> ...

1417 - | 1388 -


© 2015-2024 lektsii.org - -

: 0.059 .