2015-08-27 5 views
5

वर्चुअल टेबल व्युत्पन्न क्लास के लिए बनाई जाएगी, जिसमें वर्चुअल फ़ंक्शन को वर्चुअल फ़ंक्शन को छोड़कर वर्चुअल फ़ंक्शन नहीं है जिसे ओवरराइड नहीं किया गया है व्युत्पन्न कक्षाव्युत्पन्न वर्ग के लिए वर्चुअल टेबल जिसमें पैरेंट क्लास को वर्चुअल फ़ंक्शन को छोड़कर कोई वर्चुअल फ़ंक्शन नहीं है

पूर्व के लिए

:

class A{ 
public: 
    virtual void show(); 

}; 

class B : public A 
{ 

}; 

वहाँ अपने प्रश्न के लिए कोई मानक जवाब है वर्ग बी

+3

कौन सा कंपाइलर? मानक सी ++ नहीं जानता कि एक vTable क्या है। – Quentin

+1

आप इसकी परवाह क्यों करते हैं? क्या फर्क पड़ता है? –

+0

मैं वर्चुअल टेबल और उसके सभी मामलों के बारे में उत्सुक हूं जहां हमें डायनामिक पॉलिमॉर्फिज्म प्राप्त करने के लिए वर्चुअल टेबल की आवश्यकता है। –

उत्तर

0

भी एक प्रस्ताव पोर्टेबल ABI परिभाषित करने के लिए किया गया था।

#include <iostream> 
#include <string> 
#include <iomanip> 

using namespace std; 

class Base { 
public: 
    virtual void show() {} 
}; 

class Derived : public Base 
{ }; 

class NonVirtual { 
public: 
    void show() {} 
}; 

struct Test 
{ 
    int data1, data2; 
}; 

template <typename T> 
void showContents(T* obj, string name) 
{ 
    Test* test = new Test{}; 
    test = reinterpret_cast<Test*>(obj); 
    cout << name << ": " << hex << "0x" << test->data1 << " " << "0x" << test->data2 << endl; 
    delete test; 
} 

int main() 
{ 
    Base* base = new Base{}; 
    Derived* derived = new Derived{}; 
    NonVirtual* nonVirtual = new NonVirtual{}; 

    showContents(base, "Base"); 
    showContents(derived, "Derived"); 
    showContents(nonVirtual, "NonVirtual"); 

    delete base; 
    delete derived; 
    delete nonVirtual; 
} 

Live demo


: मैं इस साधारण प्रोग्राम है कि आधार वर्ग की सामग्री को प्रिंट, व्युत्पन्न वर्ग और एक वर्ग है कि आधार वर्ग के रूप में लेकिन आभासी एक के बजाय एक सामान्य विधि के साथ एक ही है लिखा था

cpp.sh साथ यह संकलन के बाद उपरोक्त कार्यक्रम चलाने का परिणाम (मुझे यकीन है कि क्या संकलक वहाँ प्रयोग किया जाता है नहीं कर रहा हूँ):

Base: 0x4013e0 0x0 
Derived: 0x401400 0x0 
NonVirtual: 0x0 0x0 

इसलिए मुझे उम्मीद है कि Derived ऑब्जेक्ट के लिए वास्तव में एक वर्चुअल टेबल बनाया गया है (कम से कम इस कंपाइलर के लिए - क्योंकि आवश्यक व्यवहार सी ++ मानक में परिभाषित नहीं है)।

2

की आभासी मेज के बारे में कैसे। यह वास्तव में संकलक संस्करण के आधार पर है। सी ++ में निर्दिष्ट कोई मानक एबीआई नहीं है। यदि आप गहरी दिलचस्पी रखते हैं तो कृपया "इटेनियम सी ++ एबीआई" पर नज़र डालें या असेंबलर कोड को देख कर अपने आप को जवाब ढूंढने का प्रयास करें।

आप वस्तु की सामग्री की जांच कर रहे द्वारा यह जांच कर सकते हैं के लिए सी ++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf

संबंधित मुद्दे