C++学習のメンバー関数のアクセス属性と継承属性が虚表構築に与える影響--個人的理解


C++学習の虚関数--虚関数の表解を深く理解した後、虚表の構築は虚関数のベースクラスでのアクセス属性、継承属性、サブクラスでのアクセス属性とは関係ないと感じた.
いずれにしても27種類の場合、自分で試してみることができます.
#include<iostream>
#include<cstdlib>
class parent1 {
public:
	virtual void print(){
		std::cout<<"in parent1"<<std::endl;
	}
};
class derived1 :public parent1{
private:
	virtual void print(){
		std::cout<<"in derived1"<<std::endl;
	}
};
class parent2 {
private:
	friend void parFriend2(parent2*p);
	virtual void print(){
		std::cout<<"in parent2"<<std::endl;
	}
};
void parFriend2(parent2*p){
	p->print();
}
class derived2:protected parent2{
private:
	virtual void print(){
		std::cout<<"in derived2"<<std::endl;
	}
};
class parent3 {
private:
	friend void parFriend3(parent3*p){
		p->print();
	}
	virtual void print(){
		std::cout<<"in parent3"<<std::endl;
	}
};
void parFriend3(parent3*);
class derived3 :private parent3{
protected:
	virtual void print(){
		std::cout<<"in derived3"<<std::endl;
	}
};
int main(int argc,char** argv){
	parent1* p1=new derived1;
	p1->print();
	parent2* p2=(parent2*)new derived2;
	parFriend2(p2);
	parent3* p3=(parent3*)new derived3;
	parFriend3(p3);
	return EXIT_SUCCESS;
}

出力:
in derived1 in derived2 in derived3