2026-10-25 03:14 UTC
Replies (1)
-
@TheMightyCat@ani.social 2026-10-25 04:41
It was a simplified example. B and C can’t share any other attributes without duplication of code struct A { [[nodiscard]] virtual std::uint32_t DoSomething() = 0; }; struct B : A { std::uint32_t DoSomething() override { return 0; } }; int main() { B b; b.DoSomething(); //no warning } even if you use virtual attributes aren’t inherited. If you ment members instead of attributes this is unrelated to virtual: struct A { std::uint32_t a; }; struct B : A { void DoSomething() { std::println("B"); } }; struct C : A { void DoSomething() { std::println("C"); } }; Now the member is shared and it works fine and there is no virtual. There’s also no strict enforcement of inheritance. True, but neither is there when just using virtual: struct A { virtual void DoSomething() = 0; }; struct B : A { }; This compiles fine if final is not added, Not that its an issue as reflection has solved this problem: consteval std::string_view HasMethods(std::meta::info impl, std::meta::info iface) { constexpr auto ctx = std::meta::access_context::unchecked(); for (auto fn : members_of(iface, ctx)) { if (!is_function(fn) || is_special_member_function(fn)) continue; bool found = false; for (auto cand : members_of(impl, ctx)) if (is_function(cand) && has_identifier(cand) && identifier_of(cand) == identifier_of(fn) && type_of(cand) == type_of(fn)) found = true; if (!found) return std::define_static_string(std::string(identifier_of(impl)) + " is missing " + display_string_of(fn)); } return {}; } struct A { void DoSomething(); }; struct B { }; static_assert(HasMethods(^^B, ^^A).empty(), HasMethods(^^B, ^^A)); // g++ -std=c++26 -freflection main.cpp // main.cpp:30:41: error: static assertion failed: B is missing void A::DoSomething() // 30 | static_assert(HasMethods(^^B, ^^A).empty(), HasMethods(^^B, ^^A));