तो मेरे पास कोई अमूर्त आधार वर्ग नहीं है जिसमें कोई सार तत्व नहीं है। आदेश अमूर्तता को लागू करने में, मैं (गैर तुच्छ) नाशक घोषित कर दिया है के रूप में शुद्ध आभासी:शुद्ध आभासी विरासत, एकाधिक विरासत, और सी 4505
class AbstractClass
{
public:
AbstractClass()
{
std::wcout << L"AbstractClass::AbstractClass()" << std::endl;
}
virtual ~AbstractClass() = 0
{
std::wcout << L"AbstractClass::~AbstractClass()" << std::endl;
}
};
class ConcreteClass : public AbstractClass
{
public:
ConcreteClass()
{
std::wcout << L"ConcreteClass::ConcreteClass()" << std::endl;
}
virtual ~ConcreteClass()
{
std::wcout << L"ConcreteClass::~ConcreteClass()" << std::endl;
}
};
यह बनाता है और अपेक्षा के अनुरूप काम करता है; एक कोड ब्लॉक कि बस ConcreteClass का एक उदाहरण को परिभाषित करता है के लिए उत्पादन
AbstractClass::AbstractClass() ConcreteClass::ConcreteClass() ConcreteClass::~ConcreteClass() AbstractClass::~AbstractClass()
है अब, जब मैं एक इंटरफ़ेस वर्ग के रूप में इस्तेमाल अन्य वर्ग से AbstractClass निकाले जाते है, जो अपने आप होने एक (तुच्छ) आभासी नाशक (शुद्ध या अन्यथा) , यह अभी भी काम करता है:
class IAlpha
{
public:
virtual ~IAlpha() = 0 {}
};
class AbstractClass : public IAlpha
{
public:
AbstractClass()
{
std::wcout << L"AbstractClass::AbstractClass()" << std::endl;
}
virtual ~AbstractClass() = 0
{
std::wcout << L"AbstractClass::~AbstractClass()" << std::endl;
}
};
class ConcreteClass : public AbstractClass
{
public:
ConcreteClass()
{
std::wcout << L"ConcreteClass::ConcreteClass()" << std::endl;
}
virtual ~ConcreteClass()
{
std::wcout << L"ConcreteClass::~ConcreteClass()" << std::endl;
}
};
समस्या पैदा होती है जब मैं इस तरह से दो अलग अलग इंटरफेस को लागू करने का प्रयास: इस बिंदु पर
class IAlpha
{
public:
virtual ~IAlpha() = 0 {}
};
class IBeta
{
public:
virtual ~IBeta() = 0 {}
};
class AbstractClass : public IAlpha, public IBeta
{
public:
AbstractClass()
{
std::wcout << L"AbstractClass::AbstractClass()" << std::endl;
}
virtual ~AbstractClass() = 0
{
std::wcout << L"AbstractClass::~AbstractClass()" << std::endl;
}
};
class ConcreteClass : public AbstractClass
{
public:
ConcreteClass()
{
std::wcout << L"ConcreteClass::ConcreteClass()" << std::endl;
}
virtual ~ConcreteClass()
{
std::wcout << L"ConcreteClass::~ConcreteClass()" << std::endl;
}
};
, जब बू
warning C4505: 'AbstractClass::~AbstractClass' : unreferenced local function has been removed
अजीब पर्याप्त है, तथापि, उत्पादन अभी भी AbstractClass::~AbstractClass()
कहा जाता हो रही है पता चलता है: ilding, मैं निम्न चेतावनी प्राप्त करते हैं।
क्या यह एमएसवीसी 9 (वीएस 2008) में एक बग है? क्या मैं इस चेतावनी को सुरक्षित रूप से अनदेखा कर सकता हूं?
संपादित करें: मैंने क्लास परिभाषा से शुद्ध वर्चुअल विधि परिभाषाओं को अलग करने की कोशिश की है, जैसा स्पष्ट रूप से = 0 {}
सिंटैक्स वास्तव में मान्य नहीं है। दुर्भाग्यवश, सी 4505 अभी भी दिखाया गया है, चाहे मैं inline
निर्दिष्ट करता हूं या नहीं।
जब से मैं कोई रास्ता नहीं #pragma
को यह चेतावनी बाहर सिर्फ इन तरीकों के लिए (चेतावनी कोड के अन्य भागों से ट्रिगर किया जाता है) मिल गया है, मैं AbstractClass
से शुद्ध आभासी विनिर्देशक हटाने और कंस्ट्रक्टर बनाने पर भरोसा करने के लिए हो सकता है संरक्षित। एक आदर्श समाधान नहीं है, लेकिन यह एक ग़लत चेतावनी के लिए कक्षा पदानुक्रम के पुनर्मूल्यांकन को धड़कता है।
मैंने आपके लिंक में कोड की कोशिश की; यह वही चेतावनी प्राप्त करता है, भले ही पहले, यह चलने पर सही ढंग से कार्य करता है। – somethingdotjunk