c++ - 为什么我可以取消引用指向抽象类的指针?

标签 c++ pointers abstract-class

在下面的代码中,IContainer 是一个纯抽象类:它不包含任何非纯虚拟的方法。在这种情况下,我不希望能够实例化 IContainer 类型的对象,但是我确实希望能够在 IContainer* 中保存派生类的实例

在下面的 main 中,我创建了具体类 SimpleContainer 的一些实例,它实现了 IContainer。接下来,我在一些 IContainer* 变量中存储了指向这些 SimpleContainer 的指针。

这是我的问题:因为 IContainer 是一个抽象类,我不能实例化它。但是,在我的 main 底部,您可以看到我取消引用了我的 IContainer 指针以检查是否相等。为什么我能做到这一点?另外,iCont1 == iCont2*iCont1 == *iCont2 有什么区别吗?

#include <iostream>

class IContainer{
    public:
        virtual bool operator==(const IContainer& aICont) const = 0;
        virtual int getVal() const = 0;
};

class SimpleContainer : public IContainer{
    public:
        SimpleContainer(int val) : val(val){};
        int getVal() const override {return val;}
        bool operator==(const IContainer& aICont) const override
        {
            return val == aICont.getVal();
        }
    private:
        int val;
};

int main(){
    SimpleContainer cont1(1), cont2(2), cont3(1);
    IContainer* iCont1 = &cont1;
    IContainer* iCont2 = &cont2;
    IContainer* iCont3 = &cont3;

    std::cout << "iCont1 == iCont2 -> " << (iCont1 == iCont2 ? "true" : "false") << " || Expecting -> " << "false" << std::endl;        
    std::cout << "*iCont1 == *iCont2 -> " << (*iCont1 == *iCont2 ? "true" : "false") << " || Expecting -> " << "false" << std::endl; 
    std::cout << "iCont1 == iCont3 -> " << (iCont1 == iCont3 ? "true" : "false") << " || Expecting -> " << "false" << std::endl; 
    std::cout << "*iCont1 == *iCont3 -> " << (*iCont1 == *iCont3 ? "true" : "false") << " || Expecting -> " << "false" << std::endl; 
    return 0;
}  

最佳答案

你是对的,你不能拥有抽象类 IContainer 的实例,但是取消引用指针不会给你一个实例,它给你一个引用 (IContainer&),这是完全允许的。它是对(未指定的)派生类型的引用。由于它是一个引用,您可以使用点语法或其他运算符来访问接口(interface)的方法,它会使用正常的虚拟查找来找到正确的重写方法来调用,就好像它是一个指针一样。所以是的,您正在做的事情是有效的,而且是安全的。

无关,iCont1 == iCont2 比较两个指针(又名地址)是否相等,*iCont1 == *iCont2 比较两个值(又名对象)是否相等平等的。第一个问题是询问两所房子的街道地址是否相同,第二个问题是两所房子看起来是否相同。这两栋房子可能看起来一样,但它们的街道地址仍然不同。但是,如果两个街道地址相同,您就会知道只涉及一所房子。这两个比较非常彼此不同。

关于c++ - 为什么我可以取消引用指向抽象类的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577672/

相关文章:

c - 通过指向 char 的指针将值设置为 0

c++ - 为什么 puts in my_strcpy 函数没有打印下面给定代码中的值?

java - 指向抽象类

java - 如何对抽象类进行单元测试 : extend with stubs?

java - 在 Java 中使用抽象类时的编码风格

c++ - 无论如何我可以让一个模板<typename T>接受多个值吗?

c - 共享内存 - 警告 : Comparison Between Pointer and Integer

c++ - 应该如何使用 std::optional ?

c++ - 如何使用 SSL_CTX_set_split_send_fragment

c++ - 无论情况如何,字符串比较的小于运算符都会产生相同的结果