代码之家  ›  专栏  ›  技术社区  ›  sticknycu

基类中没有子类但仍被调用的友元运算符<<和>>

  •  -1
  • sticknycu  · 技术社区  · 2 年前

    为什么运营商<&书信电报;并且>>如果它们在调用<&书信电报;并且>>在儿童课堂上?

    密码

    #include <iostream>
    #include <memory>
    #include <vector>
    
    using namespace std;
    
    class Baza
    {
    protected:
        int n;
    public:
        Baza() { cout << "B\n"; }
        virtual ~Baza() { cout << "~B\n"; }
    
        friend istream& operator>>(istream& in, Baza& b);
        friend ostream& operator<<(ostream& out, const Baza& b);
    };
    
    istream& operator>>(istream& in, Baza& b)
    {
        cout<<"op >>"<<endl;
        return in;
    }
    
    ostream& operator<<(ostream& out, const Baza& b)
    {
        cout<<"op<<"<<endl;
        return out;
    }
    
    class Derivata : public Baza
    {
    public:
        Derivata() { cout << "D\n"; }
        ~Derivata() { cout << "~D\n"; }
    
    
    };
    
    
    
    int main()
    {
        vector<Derivata> v;
        v.push_back(new Derivata);
    
    // works
        Derivata d;
        cin>>d;
        cout<<d;
    
        return 0;
    }
    

    c++编译器是否正在创建一个运算符,该运算符在编译时默认调用基类方法的运算符?

    重新表述:在基类(即baza)中定义了运算符<&书信电报;并且>>作为朋友。Derivata类继承了“baza”(基类),但运算符不是继承的,因为它们是朋友。如果我使用>>并且<&书信电报;在“derivata”类中?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Miles Budnek    2 年前

    这个 operator>> 和 operator<< 你定义的绝不是 Baza 班这个 friend 关键字并不能做到这一点;它只是允许他们访问 Baza s private 和 protected 成员。

    这样一来,你所拥有的与此没有什么不同:

    class Baza {};
    class Derivata : public Baza {};
    
    void some_function(Baza&) {}
    
    int main() {
        Derivata d;
        some_function(d);
    }
    

    对基类的引用可以绑定到从该基类派生的类的对象,因此 Baza& 可以绑定到 Derivata 对象这允许您将派生类的对象传递给接受基类引用的函数。

    更换 some_function 重载运算符不会改变它的查找方式或可以传递给它的对象的语义。它所改变的只是用于调用它的语法。